回答編集履歴

3

訂正

2018/12/25 02:07

投稿

catsforepaw
catsforepaw

スコア5938

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
  x86だと、レジスターのアラインメントに合わせたメモリアドレスに対する読み書きはアトミック実行が保証されていますし、ハード的にメモリバスをロックする仕組みも備わっており、いくつかの演算命令は`LOCK`プリフィックス付けることでアトミック実行になります。また、`XCHG`命令はそれ単体でアトミック実行を保証しています。
28
28
 
29
- それらの機能をC/C++から簡単に利用するために、Windows SDKは`InterlockedAdd`などのアトミック演算関数を提供していますし、Linux等でも`<intrin.h>`ヘッダーをインクルードすれば各種アトミック演算関数が利用できます。C++で`<atomic>`が実装される前は、それらの関数を使ってアトミック演算をしておりました。
29
+ それらの機能をC/C++から簡単に利用するために、Windows SDKは`InterlockedAdd`などのアトミック演算関数を提供していますし、Linux等でも~~`<intrin.h>`ヘッダーをインクルードすれば~~[訂正]gcc独自の__sync_fetch_and系各種アトミック演算関数が利用できます。C++で`<atomic>`が実装される前は、それらの関数を使ってアトミック演算をしておりました。
30
30
 
31
31
 
32
32
 
@@ -89,3 +89,11 @@
89
89
 
90
90
 
91
91
  `atomic_flag`クラスのことでしょうか。著者が独自に作ったクラスだと思いますが、おそらくクラスの実装で適切にvolatileを使っていないので、オブジェクトに対して明示的にvolatileを付けないと意図しない動きになってしまうのでしょう。
92
+
93
+
94
+
95
+ ---
96
+
97
+ [訂正]
98
+
99
+ Linuxでは<intrin.h>をインクルードすればアトミック演算関数が使えると書きましたが勘違いでした。別の要件で<intrin.h>を使っていててっきり同じものだと勘違いしていました。しかもintrin.hではなくx86intrin.hでしたし……。

2

[追記]について追記

2018/12/25 02:07

投稿

catsforepaw
catsforepaw

スコア5938

test CHANGED
@@ -69,3 +69,23 @@
69
69
  x86だと、`SFENCE`/`LFENCE`/`MFENCE`という命令があります。あとは、特定の領域に対してオーダリングの利き具合を調整する機能もあるようです。
70
70
 
71
71
  まぁ、その辺を直接いじるのは、OS開発者かコンパイラー開発者ぐらいなものでしょう。
72
+
73
+
74
+
75
+ ---
76
+
77
+ > [追記]
78
+
79
+ > アトミック変数がvolatileの性質を含んでいるような気がしますが・・・
80
+
81
+
82
+
83
+ ここでいうアトミック変数が`<atomic>`で定義されるatomicクラスのオブジェクトのことであれば、volatileの性質を含んでいるというよりは、クラスの実装においてvolatileキーワードが各所で使われていて最適化による順序変更やコード削除を抑止する設計になっているので、いちいち変数定義時に付ける必要はないということですね。
84
+
85
+
86
+
87
+ > 質問中のコードにはなぜvolatileが登場しているんでしょうかね・・・
88
+
89
+
90
+
91
+ `atomic_flag`クラスのことでしょうか。著者が独自に作ったクラスだと思いますが、おそらくクラスの実装で適切にvolatileを使っていないので、オブジェクトに対して明示的にvolatileを付けないと意図しない動きになってしまうのでしょう。

1

不正確だったので修正

2018/12/25 01:02

投稿

catsforepaw
catsforepaw

スコア5938

test CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
 
48
48
 
49
- まったく関係ありません。
49
+ volatileは最適化しないことで結果的に書いたとおりに実行されることになりすが、それとアトミックとはまったく関係ありません。
50
50
 
51
51
 
52
52