2016-06-24 8 views
0

私が取り組んでいるプロジェクトはクリティカルセクションのカスタム実装を使用しています。 CriticalSectionLockがスコープ外になるとifブロックの同期、C++

{ 
CriticalSectionLock lock(m_criticalsection); 
...//Stuff inside the critical section 
} 

は、クリティカルセクションが終了し、次のように私は、クリティカルセクションを作成する方法です。

私の問題は、私は、クリティカルセクション内の以下のインクリメント操作を入れたいということです(私が使用することはできませんatomic_int):

if (0 == g_envCount++) 
     {... 

私は、次のような何かをしたいと思います:

{CriticalSectionLock lock(m_criticalsection); 
if (0 == g_envCount++) 
} 
     { 

しかし、私はそれはそれは読者のために非常に紛らわしいの作品場合でも思います。誰かがこれを行うためのより良い/よりクリーンな方法を提案することができますか?あなただけのクリティカルセクション内であることをインクリメントする必要があるので

+0

それだけ増分が – tkausl

+0

@tkauslを同期する必要がありますどのような不幸なことが原因で、いくつかのプラットフォームの問題ここではオプションではありませんなら、私は 'atomic_int'を使用すると思います。私は質問を更新します。 – Adam

+0

しかし、増分だけが同期されなければならず、ifブロック全体ではないという点で正しいですか?少なくとも、あなたの最後のコード-切り取らが示唆厥 – tkausl

答えて

2

、巻き上げを使用しています。

int priorEnvCount; 
{ 
    CriticalSectionLock lock(m_criticalsection); 
    priorEnvCount = g_envCount++; 
} 

if (0 == priorEnvCount) { 
    ... 
} 
+0

0 == priorEvnCountチェックを行う時点でpriorEnvCountが範囲外になることはありませんか? 「私の問題は、私は(私はatomic_intを使用することはできません)クリティカルセクション内の以下のインクリメント操作を配置することである:」 – Adam

+0

@Adam D'はええと、質問を引用する:) – kfsone

0

クリティカルセクションの代わりに、std::atomic<int>を使用してください。 コードは次のようになります。

std::atomic<int> g_envCount; 
... 
// atomically post increment g_envCount and return its current value 
if (0 == g_envCount++) { 
    // do something 
} 

ポストインクリメント演算子を使用すると、自動的に、順次一貫性メモリ順序を使用しています。メモリの順序制約を調整する場合は、fetch_add(...)を使用できます。

+0

を固定します私の答え。もともと、彼はアトミックを使用できないとは言わなかった。 – kfsone

+0

質問は後に編集された – pokey909

関連する問題