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

回答編集履歴

3

訂正

2018/12/25 02:07

投稿

catsforepaw
catsforepaw

スコア5944

answer CHANGED
@@ -12,7 +12,7 @@
12
12
  > 自分の予想なのですが・・・これってもしかしてCPUにアトミック専用命令みたいなものが用意されている?・・・のでしょうか?
13
13
 
14
14
  x86だと、レジスターのアラインメントに合わせたメモリアドレスに対する読み書きはアトミック実行が保証されていますし、ハード的にメモリバスをロックする仕組みも備わっており、いくつかの演算命令は`LOCK`プリフィックス付けることでアトミック実行になります。また、`XCHG`命令はそれ単体でアトミック実行を保証しています。
15
- それらの機能をC/C++から簡単に利用するために、Windows SDKは`InterlockedAdd`などのアトミック演算関数を提供していますし、Linux等でも`<intrin.h>`ヘッダーをインクルードすれば各種アトミック演算関数が利用できます。C++で`<atomic>`が実装される前は、それらの関数を使ってアトミック演算をしておりました。
15
+ それらの機能をC/C++から簡単に利用するために、Windows SDKは`InterlockedAdd`などのアトミック演算関数を提供していますし、Linux等でも~~`<intrin.h>`ヘッダーをインクルードすれば~~[訂正]gcc独自の__sync_fetch_and系各種アトミック演算関数が利用できます。C++で`<atomic>`が実装される前は、それらの関数を使ってアトミック演算をしておりました。
16
16
 
17
17
  > [疑問3]
18
18
  > このvolatileはどのような効果を持っているのでしょうか?
@@ -43,4 +43,8 @@
43
43
 
44
44
  > 質問中のコードにはなぜvolatileが登場しているんでしょうかね・・・
45
45
 
46
- `atomic_flag`クラスのことでしょうか。著者が独自に作ったクラスだと思いますが、おそらくクラスの実装で適切にvolatileを使っていないので、オブジェクトに対して明示的にvolatileを付けないと意図しない動きになってしまうのでしょう。
46
+ `atomic_flag`クラスのことでしょうか。著者が独自に作ったクラスだと思いますが、おそらくクラスの実装で適切にvolatileを使っていないので、オブジェクトに対して明示的にvolatileを付けないと意図しない動きになってしまうのでしょう。
47
+
48
+ ---
49
+ [訂正]
50
+ Linuxでは<intrin.h>をインクルードすればアトミック演算関数が使えると書きましたが勘違いでした。別の要件で<intrin.h>を使っていててっきり同じものだと勘違いしていました。しかもintrin.hではなくx86intrin.hでしたし……。

2

[追記]について追記

2018/12/25 02:07

投稿

catsforepaw
catsforepaw

スコア5944

answer CHANGED
@@ -33,4 +33,14 @@
33
33
  > これも、CPUにメモリバリア専用命令みたいなのが用意されているのでしょうか?
34
34
 
35
35
  x86だと、`SFENCE`/`LFENCE`/`MFENCE`という命令があります。あとは、特定の領域に対してオーダリングの利き具合を調整する機能もあるようです。
36
- まぁ、その辺を直接いじるのは、OS開発者かコンパイラー開発者ぐらいなものでしょう。
36
+ まぁ、その辺を直接いじるのは、OS開発者かコンパイラー開発者ぐらいなものでしょう。
37
+
38
+ ---
39
+ > [追記]
40
+ > アトミック変数がvolatileの性質を含んでいるような気がしますが・・・
41
+
42
+ ここでいうアトミック変数が`<atomic>`で定義されるatomicクラスのオブジェクトのことであれば、volatileの性質を含んでいるというよりは、クラスの実装においてvolatileキーワードが各所で使われていて最適化による順序変更やコード削除を抑止する設計になっているので、いちいち変数定義時に付ける必要はないということですね。
43
+
44
+ > 質問中のコードにはなぜvolatileが登場しているんでしょうかね・・・
45
+
46
+ `atomic_flag`クラスのことでしょうか。著者が独自に作ったクラスだと思いますが、おそらくクラスの実装で適切にvolatileを使っていないので、オブジェクトに対して明示的にvolatileを付けないと意図しない動きになってしまうのでしょう。

1

不正確だったので修正

2018/12/25 01:02

投稿

catsforepaw
catsforepaw

スコア5944

answer CHANGED
@@ -22,7 +22,7 @@
22
22
  > となると、このvolatileは命令の実行順序と関係がありそうですね。
23
23
  > アトミックはvolatileの性質を含んでいるのでしょうか??
24
24
 
25
- まったく関係ありません。
25
+ volatileは最適化しないことで結果的に書いたとおりに実行されることになりすが、それとアトミックとはまったく関係ありません。
26
26
 
27
27
  > [疑問4]
28
28
  > volatileとメモリバリアの違いがハッキリしません。