揮発性の読み取りと書き込みはWindows + VisualCでアトミックですか?

マーティン・バ

このサイトにはvolatile、アトミック/マルチスレッドアクセスに変数を使用できるかどうかを尋ねる質問がいくつかあります。たとえばここここまたはここ参照してください

さて、C(++)標準準拠の答えは明らかにノーです。

ただし、WindowsおよびVisual C ++コンパイラでは、状況はそれほど明確ではないようです。

最近MSDN公式ドキュメント回答して引用しました。volatile

Microsoft固有

揮発性として宣言されたオブジェクトは(...)

  • 揮発性オブジェクトへの書き込み(揮発性書き込み)には、リリースセマンティクスがあります。グローバルオブジェクトまたは静的オブジェクトへの参照これは、命令シーケンスの揮発性オブジェクトへの書き込みが、コンパイルされたバイナリの揮発性書き込みの前に発生する前に発生します。
  • 揮発性オブジェクトの読み取り(揮発性読み取り)には、取得セマンティクスがあります。グローバルオブジェクトまたは静的オブジェクトへの参照これは、命令シーケンスの揮発性メモリの読み取り後に発生し、コンパイルされたバイナリの揮発性メモリの読み取り後に発生します。

これにより、揮発性オブジェクトをマルチスレッドアプリケーションのメモリロックおよび解放に使用できます。

[私の強調]

さて、これを読むと、揮発性変数はstd::atomic、次のC ++ 11標準のようにMSコンパイラによって扱われるように思われます。

しかし、私の回答へコメントで、ユーザーのHans Passantは、「MSDNの記事は非常に残念で、完全に間違っています。Microsoftのバージョンであっても、volatileでロックを実装することはできません。(...)」と書いています。


注意:通常、アトミック交換なしではロックを実装できないため、MSDNに記載されているはかなり怪しいようですAlex指摘しているように。)これでも疑問が残ります。このMSDNの記事に記載されている他の情報の有効性、特にここここのようなユースケースの場合。)


さらに、Interlocked *関数のドキュメントがあります。特にInterlockedExchangevolatile(!?)変数を取り、アトミックな読み取り+書き込みを行います。(SOに関する1つの質問-InterlockedExchangeをいつ使用する必要がありますか? -は、この関数が読み取り専用または書き込み専用のアトミックアクセスに必要かどうかを正式に回答していません。)

さらに、volatile上記で引用しドキュメントは、「グローバルまたは静的オブジェクト」をほのめかしています。ここでは、「実際の」取得/解放セマンティクスをすべての値に適用する必要があると考えていました

質問に戻る

Windowsでは、Visual C ++(2005-2010)を使用して、(32ビット?int?)変数をvolatile、この変数へのアトミックな読み取りと書き込みを許可するものとして宣言しますか?

++のWindows / VC上で、私にとって特に重要これが何を保持する(またはしない)べきであるとされている独立プロセッサまたはプラットフォーム上のプログラムの実行の。(つまり、WinXP / 32ビットであるかItanum2で実行されているWindows2008R2 / 64ビットであるかは重要ですか?)

検証可能な情報、リンク、テストケースを使用して回答をバックアップしてください。

jcoder

はい、それらはwindows / vc ++ではアトミックです(アライメント要件などまたはコースを満たしていると仮定します)

ただし、ロックの場合は、アトミックな更新や読み取りだけでなく、アトミックなテストと設定、またはコンペア・アンド・スワップの命令などが必要になります。

そうでなければ、ロックをテストして、1つの分割できない操作でそれ要求する方法はありません

編集:以下でコメントするように、32ビット以下のx86でのすべての整列されたメモリアクセスはとにかくアトミックです。重要な点は、volatileによってメモリアクセスが順序付けられることです。(コメントでこれを指摘してくれてありがとう)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

揮発性読み取りは揮発性書き込みの前に発生しますか?

分類Dev

armatomic_ [読み取り/書き込み]操作が揮発性ポインタとして実装されているのはなぜですか?

分類Dev

Java揮発性読み取りフラッシュ書き込み、および揮発性書き込み更新読み取り

分類Dev

揮発性は導入された読み取りまたは書き込みを防ぎますか?

分類Dev

ポインターのC#(DotNet Core)での揮発性の読み取り/書き込み

分類Dev

Javaでは、ロックにより、不揮発性の場所への読み取りと書き込みの正しい順序が保証されますか

分類Dev

.NETでの可変鮮度保証(揮発性読み取りと揮発性読み取り)

分類Dev

OPC UAの読み取りおよび書き込み操作はアトミックですか?

分類Dev

Windowsでcmdの読み取りと書き込み

分類Dev

書き込み/読み取りに関してdup2はアトミックですか

分類Dev

スレッドによって書き込まれ、別のスレッドによって読み取られるJavaオブジェクトのインスタンスフィールドは、揮発性でなければなりませんか?

分類Dev

変数が割り込み中にのみ読み取られる場合、揮発性が必要です

分類Dev

2つの異なる書き込みスレッドと読み取りスレッドが同時に存続しない場合、揮発性を使用する必要がありますか

分類Dev

NoSQLの書き込み前の読み取りとは何ですか?

分類Dev

64ビット値の読み取り/書き込みは64ビットCPUでアトミックですか?

分類Dev

ファイルのアトミックな読み取りと書き込み

分類Dev

アトミック読み取り後、std :: atomicで書き込みます

分類Dev

別のスレッドからの読み取り中に不揮発性変数の古い値を読み取ることは可能ですか?

分類Dev

JITは、2つの揮発性読み取りを特定の式の1つとして折りたたむことができますか?

分類Dev

JavaでのByteBufferの一部のアトミックな読み取りと書き込み

分類Dev

Javaジェネリックスの共変性と反変性での読み取り/書き込み

分類Dev

64ビットのJVMで、ダブルアトミックの読み取りと書き込みを行っていますか?

分類Dev

int変数への書き込みと読み取りがアトミックである場合、なぜAtomicIntegerが必要なのですか?

分類Dev

Firestoreの読み取り/書き込みとクラウド機能の読み取り/書き込み

分類Dev

読み取り+書き込みと読み取り+書き込み+切り捨ての違いは何ですか?

分類Dev

cでの読み取りと書き込みを理解する

分類Dev

同期ブロックでの揮発性配列書き込みの必要性

分類Dev

ブラウザのJavaScriptで読み取り/書き込み読み取り/書き込みの同時衝突が発生する可能性はありますか?

分類Dev

MutableByteArrayへの書き込みはアトミックですか?

Related 関連記事

  1. 1

    揮発性読み取りは揮発性書き込みの前に発生しますか?

  2. 2

    armatomic_ [読み取り/書き込み]操作が揮発性ポインタとして実装されているのはなぜですか?

  3. 3

    Java揮発性読み取りフラッシュ書き込み、および揮発性書き込み更新読み取り

  4. 4

    揮発性は導入された読み取りまたは書き込みを防ぎますか?

  5. 5

    ポインターのC#(DotNet Core)での揮発性の読み取り/書き込み

  6. 6

    Javaでは、ロックにより、不揮発性の場所への読み取りと書き込みの正しい順序が保証されますか

  7. 7

    .NETでの可変鮮度保証(揮発性読み取りと揮発性読み取り)

  8. 8

    OPC UAの読み取りおよび書き込み操作はアトミックですか?

  9. 9

    Windowsでcmdの読み取りと書き込み

  10. 10

    書き込み/読み取りに関してdup2はアトミックですか

  11. 11

    スレッドによって書き込まれ、別のスレッドによって読み取られるJavaオブジェクトのインスタンスフィールドは、揮発性でなければなりませんか?

  12. 12

    変数が割り込み中にのみ読み取られる場合、揮発性が必要です

  13. 13

    2つの異なる書き込みスレッドと読み取りスレッドが同時に存続しない場合、揮発性を使用する必要がありますか

  14. 14

    NoSQLの書き込み前の読み取りとは何ですか?

  15. 15

    64ビット値の読み取り/書き込みは64ビットCPUでアトミックですか?

  16. 16

    ファイルのアトミックな読み取りと書き込み

  17. 17

    アトミック読み取り後、std :: atomicで書き込みます

  18. 18

    別のスレッドからの読み取り中に不揮発性変数の古い値を読み取ることは可能ですか?

  19. 19

    JITは、2つの揮発性読み取りを特定の式の1つとして折りたたむことができますか?

  20. 20

    JavaでのByteBufferの一部のアトミックな読み取りと書き込み

  21. 21

    Javaジェネリックスの共変性と反変性での読み取り/書き込み

  22. 22

    64ビットのJVMで、ダブルアトミックの読み取りと書き込みを行っていますか?

  23. 23

    int変数への書き込みと読み取りがアトミックである場合、なぜAtomicIntegerが必要なのですか?

  24. 24

    Firestoreの読み取り/書き込みとクラウド機能の読み取り/書き込み

  25. 25

    読み取り+書き込みと読み取り+書き込み+切り捨ての違いは何ですか?

  26. 26

    cでの読み取りと書き込みを理解する

  27. 27

    同期ブロックでの揮発性配列書き込みの必要性

  28. 28

    ブラウザのJavaScriptで読み取り/書き込み読み取り/書き込みの同時衝突が発生する可能性はありますか?

  29. 29

    MutableByteArrayへの書き込みはアトミックですか?

ホットタグ

アーカイブ