回答編集履歴
6
追記
answer
CHANGED
@@ -40,6 +40,8 @@
|
|
40
40
|
|
41
41
|
データが置かれたメモリに対する読み書きの順序 と 命令の実行順序 は厳密に区別されなくてはならない・・・ということでしょうか?
|
42
42
|
|
43
|
+
---
|
44
|
+
**[追記2]**
|
43
45
|
追記の部分は完全に不適切です。
|
44
46
|
[メモリバリア](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%90%E3%83%AA%E3%82%A2#%E3%82%A2%E3%82%A6%E3%83%88%E3%82%AA%E3%83%96%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E5%AE%9F%E8%A1%8C%E3%81%A8%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%81%AB%E3%82%88%E3%82%8B%E5%91%BD%E4%BB%A4%E9%A0%86%E5%BA%8F%E3%81%AE%E6%9C%80%E9%81%A9%E5%8C%96)
|
45
47
|
|
5
追記
answer
CHANGED
@@ -26,8 +26,8 @@
|
|
26
26
|
**[追記]**
|
27
27
|
メモリバリアには、アウトオブオーダー実行の命令順序の変更ができないようにします。
|
28
28
|
コンパイル時の命令順序変更をできないようにするには、メモリバリアでも可能なはずです。
|
29
|
-
(コンパイル時に変更できちゃったら、元も子もないような・・・)
|
29
|
+
~~(コンパイル時に変更できちゃったら、元も子もないような・・・)~~
|
30
|
-
つまり、**メモリバリアは、volatileの代替になる場合がある**。ということですよね。
|
30
|
+
~~つまり、**メモリバリアは、volatileの代替になる場合がある**。ということですよね。~~
|
31
31
|
|
32
32
|
std::atomicには、逐次一貫のため、内部にメモリバリアを用いていますね。
|
33
33
|
つまり、std::atomicは、volatileの一部の機能を含んでいることになりますよね。
|
@@ -38,4 +38,11 @@
|
|
38
38
|
|
39
39
|
実際、Effective modern C++ にはそれに似たような事が書かれていますね。
|
40
40
|
|
41
|
-
データが置かれたメモリに対する読み書きの順序 と 命令の実行順序 は厳密に区別されなくてはならない・・・ということでしょうか?
|
41
|
+
データが置かれたメモリに対する読み書きの順序 と 命令の実行順序 は厳密に区別されなくてはならない・・・ということでしょうか?
|
42
|
+
|
43
|
+
追記の部分は完全に不適切です。
|
44
|
+
[メモリバリア](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%90%E3%83%AA%E3%82%A2#%E3%82%A2%E3%82%A6%E3%83%88%E3%82%AA%E3%83%96%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E5%AE%9F%E8%A1%8C%E3%81%A8%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%81%AB%E3%82%88%E3%82%8B%E5%91%BD%E4%BB%A4%E9%A0%86%E5%BA%8F%E3%81%AE%E6%9C%80%E9%81%A9%E5%8C%96)
|
45
|
+
|
46
|
+
> メモリバリア命令はハードウェアレベルの命令並べ替えに対するものである。コンパイラも最適化処理の一環として命令の並べ替えをすることがある。
|
47
|
+
|
48
|
+
えーー。つまりvolatileの代替にメモリバリアを使用することはできない。ということですね。
|
4
追記
answer
CHANGED
@@ -24,8 +24,9 @@
|
|
24
24
|
|
25
25
|
---
|
26
26
|
**[追記]**
|
27
|
-
メモリバリアには、アウトオブオーダー実行の命令順序の変更ができないように
|
27
|
+
メモリバリアには、アウトオブオーダー実行の命令順序の変更ができないようにします。
|
28
28
|
コンパイル時の命令順序変更をできないようにするには、メモリバリアでも可能なはずです。
|
29
|
+
(コンパイル時に変更できちゃったら、元も子もないような・・・)
|
29
30
|
つまり、**メモリバリアは、volatileの代替になる場合がある**。ということですよね。
|
30
31
|
|
31
32
|
std::atomicには、逐次一貫のため、内部にメモリバリアを用いていますね。
|
3
追記
answer
CHANGED
@@ -20,4 +20,21 @@
|
|
20
20
|
[ロックフリープログラミングの手法を使うときは ABA 問題を避ける](https://www.jpcert.or.jp/sc-rules/c-con09-c.html)
|
21
21
|
> ロックフリープログラミングの手法では、CAS (compare and swap) や LL/SC (load linked/store conditional) といった特別なアトミックプロセッサ命令、あるいは C の標準関数である atomic_compare_exchange を使う必要がある
|
22
22
|
|
23
|
-
これを見る限りだと、アトミック処理を使用しないで、ロックフリーを実現するのは不可能・・・ということですかね・・・
|
23
|
+
これを見る限りだと、アトミック処理を使用しないで、ロックフリーを実現するのは不可能・・・ということですかね・・・
|
24
|
+
|
25
|
+
---
|
26
|
+
**[追記]**
|
27
|
+
メモリバリアには、アウトオブオーダー実行の命令順序の変更ができないようになっています。
|
28
|
+
コンパイル時の命令順序変更をできないようにするには、メモリバリアでも可能なはずです。
|
29
|
+
つまり、**メモリバリアは、volatileの代替になる場合がある**。ということですよね。
|
30
|
+
|
31
|
+
std::atomicには、逐次一貫のため、内部にメモリバリアを用いていますね。
|
32
|
+
つまり、std::atomicは、volatileの一部の機能を含んでいることになりますよね。
|
33
|
+
|
34
|
+
ん???
|
35
|
+
なんか・・・変!
|
36
|
+
std::atomicを、命令実行順序の変更をさせないという目的においては、volatileの代替として利用することができることになりますね。
|
37
|
+
|
38
|
+
実際、Effective modern C++ にはそれに似たような事が書かれていますね。
|
39
|
+
|
40
|
+
データが置かれたメモリに対する読み書きの順序 と 命令の実行順序 は厳密に区別されなくてはならない・・・ということでしょうか?
|
2
修正
answer
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
atomic代替のために、volatileを用いてならない。
|
2
|
-
また、volatileの代替としてatomicを用い
|
2
|
+
また、volatileの代替としてatomicを用いてはならない。
|
3
3
|
|
4
4
|
ということは良いですよね。
|
5
5
|
volatile std::atomic_flag
|
1
修正
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
atomicのために、volatileを用いてならない。
|
1
|
+
atomic代替のために、volatileを用いてならない。
|
2
2
|
また、volatileの代替としてatomicを用いいてはならない。
|
3
3
|
|
4
4
|
ということは良いですよね。
|