回答編集履歴

2

typo修正

2016/11/11 04:20

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
 
30
30
 
31
- まず、複数のスレッドにおいて書き込みを行う場合がある変数は、書き込みと読み出しの両方ともmutexなりatmicなりで保護するべきです。
31
+ まず、マルチ・スレッド・プログラムで書き込みを行う場合がある変数は、書き込みと読み出しの両方ともmutexなりatmicなりで保護するべきです。
32
32
 
33
33
 
34
34
 

1

補足

2016/11/11 04:20

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -17,3 +17,35 @@
17
17
  std::atmicの実装を見たことはないですが、intなら元々アトミックなCPUが多いので、そのようなCPUなら保護をわざわざかけていないことを期待できます。それを期待する場合はmw保護を外してyをstd::atmic_intにするのが好ましいと思います。
18
18
 
19
19
  逆にそれを期待しないのならば、mutexによる保護の回数を減らすために、全部1つのmutexで保護してしまい、std::atmic_intしないのが好ましいと思います。
20
+
21
+
22
+
23
+ ---
24
+
25
+ 【補足】
26
+
27
+ 書き方がちょっとまずかったようですので補足します。
28
+
29
+
30
+
31
+ まず、複数のスレッドにおいて書き込みを行う場合がある変数は、書き込みと読み出しの両方ともmutexなりatmicなりで保護するべきです。
32
+
33
+
34
+
35
+ さて、std::atmicでどのようにして「アトミック」にアクセスできるよう保護されているのか、考えておく必要があります。複数回に分けてアクセスされるメモリを確定的に保護する場合、mutex等による排他制御が必要です。そして、一般にmutexが最も軽いと言われています。なのでstd::atmicの実装もmutexを使っている筈です。つまり、どちらを使っても性能的には大差ないです。
36
+
37
+
38
+
39
+ ただし、元々アトミックにアクセスされる型なら改めてmutexにより保護する必要はないですから、処理系はmutex保護を省略する実装になっている筈です。なので効率は上がります。(そのためのstd::atmicと思います。でなければ毎回mutexで保護する効率の悪いstd::atmicなど必要性は低いですから。)
40
+
41
+
42
+
43
+ しかし、同時に複数の変数をstd::atmicで保護した場合、それがアトミックにアクセスされない型なら、それぞれが別途mutex等の保護下にはいるため、効率は落ちます。
44
+
45
+ 慎重に見極めないと性能は劣化します。
46
+
47
+
48
+
49
+ そして、int型はアトミックにアクセスされる処理系がほとんどでしょうから、std::atmic_intは積極的に使っていってよいと思います。
50
+
51
+