teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

appendix

2018/08/30 03:52

投稿

yohhoy
yohhoy

スコア6191

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
+ ```