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

回答編集履歴

2

typo修正

2016/11/11 04:20

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -13,7 +13,7 @@
13
13
  【補足】
14
14
  書き方がちょっとまずかったようですので補足します。
15
15
 
16
- まず、複数のスレッドにおいて書き込みを行う場合がある変数は、書き込みと読み出しの両方ともmutexなりatmicなりで保護するべきです。
16
+ まず、マルチ・スレッド・プログラムで書き込みを行う場合がある変数は、書き込みと読み出しの両方ともmutexなりatmicなりで保護するべきです。
17
17
 
18
18
  さて、std::atmicでどのようにして「アトミック」にアクセスできるよう保護されているのか、考えておく必要があります。複数回に分けてアクセスされるメモリを確定的に保護する場合、mutex等による排他制御が必要です。そして、一般にmutexが最も軽いと言われています。なのでstd::atmicの実装もmutexを使っている筈です。つまり、どちらを使っても性能的には大差ないです。
19
19
 

1

補足

2016/11/11 04:20

投稿

Chironian
Chironian

スコア23274

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は積極的に使っていってよいと思います。