複数のスレッドが同じ値を同じ変数に同時に安全に書き込むことができますか?

Karu

複数のスレッドが同じ値を同じ変数に同時に安全に書き込むことができますか?

特定の例として、以下のコードは、C ++標準によって、すべての準拠システムでコンパイル、未定義の動作なしで実行、「true」を出力することが保証されていますか?

#include <cstdio>
#include <thread>

int main()
{
    bool x = false;
    std::thread one{[&]{ x = true; }};
    std::thread two{[&]{ x = true; }};
    one.join();
    two.join();
    std::printf(x ? "true" : "false");
}

これは理論的な質問です。実際に機能するかどうかではなく、常に機能するかどうか(またはこのようなコードを書くのが良い考えかどうか:))を知りたいです。誰かが規格の関連部分を指摘していただければ幸いです。私の経験では、それは常に実際に機能しますが、それが機能することが保証されstd::atomicているかどうかわからないので、代わりに常に使用します-この特定のケースに厳密に必要かどうかを知りたいです。

軌道上の明度レース

番号。

ミューテックスを使用するか、アトミックにすることにより、これらの変数へのアクセス同期する必要があります。

同じ値が書き込まれている場合の免除はありませんその値の記述にどのような手順が含まれるか(これは根本的な実際的な懸念事項です)、またコードが未定義の動作をする理由である標準もわかりません…つまり、コンパイラーはプログラムで絶対的な混乱を引き起こすことができます(あなたが避ける必要がある本当の問題)。

誰かがやって来て、そのようなアーキテクチャがこれらのサイズの変数へのアトミック書き込みを保証するとあなたに言うでしょう。しかし、それはUBの側面を変えるものではありません。

あなたが探しているパッセージは次のとおりです。

[intro.races/2]一方がメモリ位置([intro.memory])を変更し、もう一方が同じメモリ位置を読み取るか変更すると、2つの式の評価が競合します。

[intro.races/21]:[…]プログラムの実行には、競合する可能性のある2つのアクションが含まれている場合データ競合が含まれます[…]。このようなデータの競合は、未定義の動作を引き起こします。

…そして周囲の言葉遣い。このセクションは実際には非常に難解ですが、これはプログラミングに関するどの本でも読むことができる古典的な教科書のデータ競合であるため、実際に解析する必要はありません。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

複数のPythonスレッドが同じリストの異なるレコードに同時に書き込みます-これは大丈夫ですか?

分類Dev

値が読み取られない場合、複数のスレッドが同じブール値に書き込むのは安全ですか?

分類Dev

複数のスレッドが同時にファイルにデータを書き込むことはできますか?

分類Dev

Pythonで同じCSVに書き込む複数のスレッド

分類Dev

BASH:複数のbashバックグラウンドプロセスが同じファイルに書き込むのは安全ですか?

分類Dev

パンダは同じCSVファイルに同時に書き込むことができますか?

分類Dev

複数のスレッドが同じMulticastSocketに書き込んでいる間、何らかの相互排除を行う必要がありますか?

分類Dev

複数のRandomAccessFileオブジェクトが同じファイルにデータを書き込むことはできますか?

分類Dev

WriteBatchで同じドキュメントに書き込むと、Firebaseで複数の書き込みが発生しますか?

分類Dev

2つのスレッドが同じ配列の異なる要素に書き込むことはできますか?

分類Dev

異なるスレッドが同じVecの異なるセクションに書き込むことはできますか?

分類Dev

同じFileWriterファイルを使用して、複数のメソッドからそれに書き込むことは可能ですか?

分類Dev

並行プロセスがグローバル変数に同じ値を書き込むとどうなりますか?

分類Dev

複数のスレッドから同じFluxSinkを同時に使用しても安全ですか?

分類Dev

同じファイルへの複数のFileWriterストリームを同時に開くことができますか?

分類Dev

すべてのスレッドが常に同じ値を共有メモリに書き込むことが確実な場合は、ロックを使用する必要がありますか?

分類Dev

複数のスレッドから同じCGContextRefに描画できますか?

分類Dev

複数のJavaプロセスが同じファイルを同時に読み取ることはできますか?

分類Dev

FileWriterとbufferedwriterをJavaの同じクラスに書き込むことはできますか?

分類Dev

同じ行のcsvに変数とリストを書き込む

分類Dev

複数のスレッドが同じクラスメンバー変数を読み取ることはできますか?

分類Dev

複数のスレッドが同じファイルを書き込むのを防ぐ

分類Dev

同じ ID に複数の文字列を書き込む

分類Dev

Pool.map()を使用して複数のプロセスに同じディクショナリを書き込むことは可能ですか?

分類Dev

複数のスレッドが同時にロードされるように、同じクラスのために頼むときはどうなりますか?

分類Dev

スレッド2が同じファイルに書き込むときに、スレッド1はファイルから読み取ります

分類Dev

Java:複数のスレッドが同じInputStreamを同時に読み取ります

分類Dev

複数の基本クラスが同じ仮想メソッドを持つことはできますか?

分類Dev

同じtarアーカイブを2つのテープに同時に書き込むことはできますか?

Related 関連記事

  1. 1

    複数のPythonスレッドが同じリストの異なるレコードに同時に書き込みます-これは大丈夫ですか?

  2. 2

    値が読み取られない場合、複数のスレッドが同じブール値に書き込むのは安全ですか?

  3. 3

    複数のスレッドが同時にファイルにデータを書き込むことはできますか?

  4. 4

    Pythonで同じCSVに書き込む複数のスレッド

  5. 5

    BASH:複数のbashバックグラウンドプロセスが同じファイルに書き込むのは安全ですか?

  6. 6

    パンダは同じCSVファイルに同時に書き込むことができますか?

  7. 7

    複数のスレッドが同じMulticastSocketに書き込んでいる間、何らかの相互排除を行う必要がありますか?

  8. 8

    複数のRandomAccessFileオブジェクトが同じファイルにデータを書き込むことはできますか?

  9. 9

    WriteBatchで同じドキュメントに書き込むと、Firebaseで複数の書き込みが発生しますか?

  10. 10

    2つのスレッドが同じ配列の異なる要素に書き込むことはできますか?

  11. 11

    異なるスレッドが同じVecの異なるセクションに書き込むことはできますか?

  12. 12

    同じFileWriterファイルを使用して、複数のメソッドからそれに書き込むことは可能ですか?

  13. 13

    並行プロセスがグローバル変数に同じ値を書き込むとどうなりますか?

  14. 14

    複数のスレッドから同じFluxSinkを同時に使用しても安全ですか?

  15. 15

    同じファイルへの複数のFileWriterストリームを同時に開くことができますか?

  16. 16

    すべてのスレッドが常に同じ値を共有メモリに書き込むことが確実な場合は、ロックを使用する必要がありますか?

  17. 17

    複数のスレッドから同じCGContextRefに描画できますか?

  18. 18

    複数のJavaプロセスが同じファイルを同時に読み取ることはできますか?

  19. 19

    FileWriterとbufferedwriterをJavaの同じクラスに書き込むことはできますか?

  20. 20

    同じ行のcsvに変数とリストを書き込む

  21. 21

    複数のスレッドが同じクラスメンバー変数を読み取ることはできますか?

  22. 22

    複数のスレッドが同じファイルを書き込むのを防ぐ

  23. 23

    同じ ID に複数の文字列を書き込む

  24. 24

    Pool.map()を使用して複数のプロセスに同じディクショナリを書き込むことは可能ですか?

  25. 25

    複数のスレッドが同時にロードされるように、同じクラスのために頼むときはどうなりますか?

  26. 26

    スレッド2が同じファイルに書き込むときに、スレッド1はファイルから読み取ります

  27. 27

    Java:複数のスレッドが同じInputStreamを同時に読み取ります

  28. 28

    複数の基本クラスが同じ仮想メソッドを持つことはできますか?

  29. 29

    同じtarアーカイブを2つのテープに同時に書き込むことはできますか?

ホットタグ

アーカイブ