回答編集履歴
2
typo修正
answer
CHANGED
@@ -13,7 +13,7 @@
|
|
13
13
|
【補足】
|
14
14
|
書き方がちょっとまずかったようですので補足します。
|
15
15
|
|
16
|
-
まず、
|
16
|
+
まず、マルチ・スレッド・プログラムで書き込みを行う場合がある変数は、書き込みと読み出しの両方ともmutexなりatmicなりで保護するべきです。
|
17
17
|
|
18
18
|
さて、std::atmicでどのようにして「アトミック」にアクセスできるよう保護されているのか、考えておく必要があります。複数回に分けてアクセスされるメモリを確定的に保護する場合、mutex等による排他制御が必要です。そして、一般にmutexが最も軽いと言われています。なのでstd::atmicの実装もmutexを使っている筈です。つまり、どちらを使っても性能的には大差ないです。
|
19
19
|
|
1
補足
answer
CHANGED
@@ -7,4 +7,19 @@
|
|
7
7
|
|
8
8
|
次にmutex保護とstd::atmicによる保護を多重にかける必要はないです。
|
9
9
|
std::atmicの実装を見たことはないですが、intなら元々アトミックなCPUが多いので、そのようなCPUなら保護をわざわざかけていないことを期待できます。それを期待する場合はmw保護を外してyをstd::atmic_intにするのが好ましいと思います。
|
10
|
-
逆にそれを期待しないのならば、mutexによる保護の回数を減らすために、全部1つのmutexで保護してしまい、std::atmic_intしないのが好ましいと思います。
|
10
|
+
逆にそれを期待しないのならば、mutexによる保護の回数を減らすために、全部1つのmutexで保護してしまい、std::atmic_intしないのが好ましいと思います。
|
11
|
+
|
12
|
+
---
|
13
|
+
【補足】
|
14
|
+
書き方がちょっとまずかったようですので補足します。
|
15
|
+
|
16
|
+
まず、複数のスレッドにおいて書き込みを行う場合がある変数は、書き込みと読み出しの両方ともmutexなりatmicなりで保護するべきです。
|
17
|
+
|
18
|
+
さて、std::atmicでどのようにして「アトミック」にアクセスできるよう保護されているのか、考えておく必要があります。複数回に分けてアクセスされるメモリを確定的に保護する場合、mutex等による排他制御が必要です。そして、一般にmutexが最も軽いと言われています。なのでstd::atmicの実装もmutexを使っている筈です。つまり、どちらを使っても性能的には大差ないです。
|
19
|
+
|
20
|
+
ただし、元々アトミックにアクセスされる型なら改めてmutexにより保護する必要はないですから、処理系はmutex保護を省略する実装になっている筈です。なので効率は上がります。(そのためのstd::atmicと思います。でなければ毎回mutexで保護する効率の悪いstd::atmicなど必要性は低いですから。)
|
21
|
+
|
22
|
+
しかし、同時に複数の変数をstd::atmicで保護した場合、それがアトミックにアクセスされない型なら、それぞれが別途mutex等の保護下にはいるため、効率は落ちます。
|
23
|
+
慎重に見極めないと性能は劣化します。
|
24
|
+
|
25
|
+
そして、int型はアトミックにアクセスされる処理系がほとんどでしょうから、std::atmic_intは積極的に使っていってよいと思います。
|