回答編集履歴
6
追記
test
CHANGED
@@ -82,6 +82,10 @@
|
|
82
82
|
|
83
83
|
|
84
84
|
|
85
|
+
---
|
86
|
+
|
87
|
+
**[追記2]**
|
88
|
+
|
85
89
|
追記の部分は完全に不適切です。
|
86
90
|
|
87
91
|
[メモリバリア](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)
|
5
追記
test
CHANGED
@@ -54,9 +54,9 @@
|
|
54
54
|
|
55
55
|
コンパイル時の命令順序変更をできないようにするには、メモリバリアでも可能なはずです。
|
56
56
|
|
57
|
-
(コンパイル時に変更できちゃったら、元も子もないような・・・)
|
57
|
+
~~(コンパイル時に変更できちゃったら、元も子もないような・・・)~~
|
58
58
|
|
59
|
-
つまり、**メモリバリアは、volatileの代替になる場合がある**。ということですよね。
|
59
|
+
~~つまり、**メモリバリアは、volatileの代替になる場合がある**。ということですよね。~~
|
60
60
|
|
61
61
|
|
62
62
|
|
@@ -79,3 +79,17 @@
|
|
79
79
|
|
80
80
|
|
81
81
|
データが置かれたメモリに対する読み書きの順序 と 命令の実行順序 は厳密に区別されなくてはならない・・・ということでしょうか?
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
追記の部分は完全に不適切です。
|
86
|
+
|
87
|
+
[メモリバリア](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)
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
> メモリバリア命令はハードウェアレベルの命令並べ替えに対するものである。コンパイラも最適化処理の一環として命令の並べ替えをすることがある。
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
えーー。つまりvolatileの代替にメモリバリアを使用することはできない。ということですね。
|
4
追記
test
CHANGED
@@ -50,9 +50,11 @@
|
|
50
50
|
|
51
51
|
**[追記]**
|
52
52
|
|
53
|
-
メモリバリアには、アウトオブオーダー実行の命令順序の変更ができないように
|
53
|
+
メモリバリアには、アウトオブオーダー実行の命令順序の変更ができないようにします。
|
54
54
|
|
55
55
|
コンパイル時の命令順序変更をできないようにするには、メモリバリアでも可能なはずです。
|
56
|
+
|
57
|
+
(コンパイル時に変更できちゃったら、元も子もないような・・・)
|
56
58
|
|
57
59
|
つまり、**メモリバリアは、volatileの代替になる場合がある**。ということですよね。
|
58
60
|
|
3
追記
test
CHANGED
@@ -43,3 +43,37 @@
|
|
43
43
|
|
44
44
|
|
45
45
|
これを見る限りだと、アトミック処理を使用しないで、ロックフリーを実現するのは不可能・・・ということですかね・・・
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
---
|
50
|
+
|
51
|
+
**[追記]**
|
52
|
+
|
53
|
+
メモリバリアには、アウトオブオーダー実行の命令順序の変更ができないようになっています。
|
54
|
+
|
55
|
+
コンパイル時の命令順序変更をできないようにするには、メモリバリアでも可能なはずです。
|
56
|
+
|
57
|
+
つまり、**メモリバリアは、volatileの代替になる場合がある**。ということですよね。
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
std::atomicには、逐次一貫のため、内部にメモリバリアを用いていますね。
|
62
|
+
|
63
|
+
つまり、std::atomicは、volatileの一部の機能を含んでいることになりますよね。
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
ん???
|
68
|
+
|
69
|
+
なんか・・・変!
|
70
|
+
|
71
|
+
std::atomicを、命令実行順序の変更をさせないという目的においては、volatileの代替として利用することができることになりますね。
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
実際、Effective modern C++ にはそれに似たような事が書かれていますね。
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
データが置かれたメモリに対する読み書きの順序 と 命令の実行順序 は厳密に区別されなくてはならない・・・ということでしょうか?
|
2
修正
test
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
atomic代替のために、volatileを用いてならない。
|
2
2
|
|
3
|
-
また、volatileの代替としてatomicを用い
|
3
|
+
また、volatileの代替としてatomicを用いてはならない。
|
4
4
|
|
5
5
|
|
6
6
|
|
1
修正
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
atomicのために、volatileを用いてならない。
|
1
|
+
atomic代替のために、volatileを用いてならない。
|
2
2
|
|
3
3
|
また、volatileの代替としてatomicを用いいてはならない。
|
4
4
|
|