3

一連の値をインクリメント/変更する必要があるマルチスレッド アプリケーション (C++) があります。一連のインターロック操作を使用する場合、それらは単一のアトミック操作と見なされますか? この例のように:

InterlockedIncrement(&value1);
InterlockedIncrement(&value2);
InterlockedExchange(&oldValue, newValue);

それとも、同期を実行するためにロックした方がよいでしょうか? このような:

EnterCriticalSection(&cs);
value1++;
value2++;
oldValue = newValue;
LeaveCriticalSection(&cs);

ロックが必要だと思いますが、よくわかりません...すべての値が古い状態または新しい状態にあることが非常に重要です。

4

5 に答える 5

14

InterlockedIncrement それ自体はアトミック操作ですが、一連の操作はInterLockedIncrement一緒にアトミックではありません。一連の操作の原子性を取得することが要件である場合は、クリティカルセクションを使用できます。

于 2009-06-11T20:07:23.883 に答える
4

一貫した状態を維持するために値を完全に実行する必要がある場合は、クリティカル セクションを使用する必要があります。たとえば、値が実際に次のようなものである場合

   President = Barack Obama;
   VP = Joe Biden;

クリティカルセクションを使用していなかった場合、これらのステートメントの実行中に何らかの中断またはコンテキストの切り替えがあった場合、バラク・オバマが大統領に、ディック・チェイニーが副大統領に就任したという状況になる可能性があります。この状態には一貫性がありません。私たち全員が同意すると思います:)

ただし、次のようなことをしている場合

   Debit $5 from account;
   Credit $2 to account;

各操作の結果が完全な状態のままである場合、インターロックは問題ありません。

于 2009-06-11T20:09:56.870 に答える
1

原子性を確保するには、クリティカル セクションを使用する必要があります。

于 2009-06-11T20:09:50.430 に答える
1

「状態」とは何かを定義する必要があります。3 つの変数すべてをアトミックに変更したいようです。この場合、3 つの個別のアトミックでは不十分です。しかし、すべての状態を何らかのオブジェクトにグループ化できる場合は、状態を更新するために「ポインターのスワップ」手法を使用できるはずです。

于 2009-06-11T20:10:52.190 に答える
1

すべての値が古い状態か新しい状態のどちらかであるからです。クリティカルセクションを使用する必要があります

于 2009-06-11T20:11:30.860 に答える