回答編集履歴

6

追記

2018/12/25 11:40

投稿

strike1217
strike1217

スコア651

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

追記

2018/12/25 11:40

投稿

strike1217
strike1217

スコア651

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

追記

2018/12/25 11:39

投稿

strike1217
strike1217

スコア651

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

追記

2018/12/25 06:23

投稿

strike1217
strike1217

スコア651

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

修正

2018/12/25 06:21

投稿

strike1217
strike1217

スコア651

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

修正

2018/12/25 05:57

投稿

strike1217
strike1217

スコア651

test CHANGED
@@ -1,4 +1,4 @@
1
- atomicのために、volatileを用いてならない。
1
+ atomic代替のために、volatileを用いてならない。
2
2
 
3
3
  また、volatileの代替としてatomicを用いいてはならない。
4
4