3

私は、一連の値を増減する必要があるマルチスレッドアプリケーション(C++)を持っています。 一連の連動操作を使用する場合、それらは単一のアトミック操作と見なされますか?この例のように:連動した操作を使用して複数の値を更新し、クリティカルセクション/ミューテックスをロックすることはできませんか?

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

また、同期を実行するためのロックが良いでしょうか?このように:

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

私はロックが必要とされると思いますが、私はわからないんだけど...それはすべての値が一緒に、古い状態で、または新しいもののいずれかであることをすることが非常に重要です。

答えて

14

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

+2

これに加えて、例外の場合にLeaveCriticalSectionが呼び出されない可能性があるため、EnterCriticalSection&LeaveCriticalSectionを直接使用しないでください。したがって、自動的にあなたのためにクリティカルセクションをロックし、ロックを解除するクラスCSingleLockを使用してください。 – Naveen

1

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

4

一貫した状態を維持するために値を完全に実行する必要がある場合は、クリティカルセクションを使用する必要があります。自分の価値観が実際に

President = Barack Obama; 
    VP = Joe Biden; 

のようなものだったし、クリティカルセクションを使用していなかった場合たとえば、あなたは、いくつかを持っていた場合は社長とディック・チェイニーは、VPだったとしてバラク・オバマを入れた状況で可能性がありそのようなステートメントの実行間の中断や種類切り替えの種類。この状態は、私たちはすべてしかし:)

を同意するだろうと思う矛盾しているあなたは

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

のようなものをやっているし、各操作の結果は、完全な状態を放置すれば、インターロックは、罰金になります。

+1

+1の素敵な例.. – Naveen

1

「状態」が何であるかを定義する必要があります。 3つの変数すべてを原子的に変更する必要があるように見えます。この場合、3つの個別のアトミックでは不十分です。しかし、すべての状態をある種のオブジェクトにまとめることができれば、状態を更新するための「ポインタを交換する」技法を使用できるはずです。

1

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

関連する問題