回答編集履歴
2
typo修正
test
CHANGED
@@ -28,7 +28,7 @@
|
|
28
28
|
|
29
29
|
|
30
30
|
|
31
|
-
まず、
|
31
|
+
まず、マルチ・スレッド・プログラムで書き込みを行う場合がある変数は、書き込みと読み出しの両方ともmutexなりatmicなりで保護するべきです。
|
32
32
|
|
33
33
|
|
34
34
|
|
1
補足
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
|
+
|