4

今は書くのが複雑classで、ずっと使っていると感じましたCRITICAL_SECTION

私の知る限り、ハードウェアまたはソフトウェアの割り込みなしで常に実行される、いくつかのタイプのアトミック操作があります。

すべてを正しく理解しているかどうかを確認したい。

  • アトミック値を設定または取得する必要はありませんCRITICAL_SECTION。これを行うと、割り込みが発生しないためです。
  • boolアトミックです。

それで、私の声明があります、それらが正しいかどうか、また正しいかどうか、どのタイプの変数が設定またはなしで取得される可能性があるかを尋ねたいCRITICAL_SECTIONですか?

PS私は、メソッドごとに1つの値を取得または設定することについて話している.2つではなく、5つではなく、1つ.

4

4 に答える 4

5
  1. アトミック データをロックする必要はありませんが、内部的にはロックされる可能性があります。たとえば、C++11std::atomicにはis_lock_free関数があることに注意してください。
  2. boolアトミックではない可能性があります。こちらとこちらをご覧ください
于 2013-08-19T13:53:29.983 に答える
4

注: この回答は Windows に適用され、他のプラットフォームについては何も述べていません。

InterlockedRead または InterlockedWrite 関数はありません。Windows では、正しい整数サイズ (およびアライメント) での単純な読み取りと書き込みはアトミックです ( 「適切にアライメントされた 32 ビット変数への単純な読み取りと書き込みはアトミック操作です。」 )。

(そして、適切に配置された変数は常に単一のキャッシュ ライン上にあるため、キャッシュの問題はありません)。

ただし、そのような変数 (またはその他の変数) の読み取りと変更はアトミックではありません。

  • bool?を読む 罰金。テスト アンド セット a bool? InterlockedCompareExchangeを使用することを お勧めします。
  • 整数を上書きしますか? すごい!それに追加しますか?クリティカル セクション。
于 2013-08-19T15:31:21.350 に答える
2

ここでこれを見つけることができます:

適切に配置された 64 ビット変数への単純な読み取りと書き込みは、64 ビット Windows ではアトミックです。32 ビット Windows では、64 ビット値の読み取りと書き込みがアトミックであるとは限りません。他のサイズの変数への読み取りと書き込みは、どのプラットフォームでもアトミックであるとは限りません。

結果は正しいはずですが、プログラミングではshouldを信頼しないほうがよいでしょう。CPU キャッシュが原因で、まだわずかに障害が発生する可能性が残っています。

于 2013-08-19T13:56:16.490 に答える
1

bool,すべての実装/プラットフォーム/コンパイラ、またはその他のタイプ、またはほとんどの操作がアトミックであることを保証することはできません。だから、いいえ、私はあなたの発言が正しいとは思いません。ロジックを改造したり、原子性を確立する他の手段を使用したりすることはできますが、CRITICAL_SECTIONそれに依存している場合は、使用を削除するだけではおそらくうまくいきません。

于 2013-08-19T13:53:46.310 に答える