回答編集履歴
1
appendix
answer
CHANGED
@@ -2,4 +2,14 @@
|
|
2
2
|
|
3
3
|
いいえ。`std::atomic<T*> p`が保証するアトミック性(スレッドセーフ性)は、ポインタ`p`自身への書き込み・読み取り操作だけです。ポインタが指す先`*p`の`T`型オブジェクトのスレッドセーフについては、`T`型それ自身で対応する必要があります。
|
4
4
|
|
5
|
-
質問掲示コードは`my_struct::value`においてデータ競合(data race)を引き起こすため、プログラムは未定義動作となります。
|
5
|
+
質問掲示コードは`my_struct::value`においてデータ競合(data race)を引き起こすため、プログラムは未定義動作となります。
|
6
|
+
|
7
|
+
----
|
8
|
+
|
9
|
+
題意とは直接関係しませんが、掲示コードの★箇所が気になりました。ここでの`t`は常にjoinableですから、`t.join();`とだけ書けば十分かと思います。また仮に`t.joinable()`がfalseだとすると、`t.detach()`は例外`std::system_error`をスローします(期待する動作ではないですよね?)
|
10
|
+
|
11
|
+
```c
|
12
|
+
std::thread t(&myclass::mystruct_worker, &m, 10000);
|
13
|
+
// ...
|
14
|
+
t.joinable() ? t.join() : t.detach(); // ★
|
15
|
+
```
|