4

私は答えを見つけることができませんが、それは簡単な質問です:

2 つのスレッドが c++ でユーザー定義オブジェクトへのポインターの値をロックやその他の悪ふざけなしで同時に読み取ることは安全ですか?

4

4 に答える 4

8

はい。実際には、(組み込み型の) 任意の値を同時に読み取っても安全です。

データ競合は、値がそれを使用している他のスレッドと同時に変更された場合にのみ発生します。このための基準からの重要な声明は次のとおりです。

データ競合は §1.10/21 で定義されています。

プログラムの実行にデータ競合が含まれているのは、異なるスレッドに競合する 2 つのアクションが含まれており、そのうちの少なくとも 1 つがアトミックではなく、どちらも他のスレッドの前に発生しない場合です。

§1.10/4で競合が定義されている場合:

2 つの式の評価は、一方がメモリ ロケーション (1.7) を変更し、もう一方が同じメモリ ロケーションにアクセスまたは変更する場合に競合します。

したがって、これらの読み取りと書き込みの間で適切な同期を使用する必要があります。

于 2013-02-05T17:56:24.117 に答える
3

複数のスレッドから値を読み取ることは常に安全です。同時アクセスを管理する必要があるのは、データへの書き込みも行う場合のみです。

読み取り専用データで考えられる唯一の問題は、読み取りが完了したときに値が実際に初期化されていることを確認することです。スレッドを開始する前に値を初期化すれば問題ありません。

于 2013-02-05T17:52:13.173 に答える
1

スレッドの 1 つで変数が変更された場合、通常はスレッドセーフではありません。

于 2013-02-05T17:48:02.593 に答える
1

スレッドセーフとは、アトミックな書き込みがあるかどうかを尋ねることを意味していると思います。C++03 ではスレッドについて実際には認識しないため、これは当てはまりません。C++11 には、ポインターに特化したstd::atomicがあります。

于 2013-02-05T17:48:19.723 に答える