Skip to content

Commit 1dd1b04

Browse files
committed
C++26 P3475R2 consume操作の非推奨化(#1420)
- memory_order::consume列挙子 非推奨 - kill_dependency関数 非推奨 - carries_dependency属性 削除
1 parent a19e427 commit 1dd1b04

File tree

8 files changed

+50
-9
lines changed

8 files changed

+50
-9
lines changed

lang/cpp11/attributes.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
属性は`[[attr]]`のように、属性のリストを二重角カッコで囲んで指定する。C++11時点の標準では、以下の2つの属性を定義する:
1616

1717
1. `[[noreturn]]` : 関数が決して返らないことをコンパイラに伝える
18-
2. `[[carries_dependency]]` : データの依存性を持たせる or 維持する
18+
2. `[[carries_dependency]]` : データの依存性を持たせる or 維持する (C++26で削除)
1919

2020

2121
## 仕様
@@ -60,6 +60,10 @@ int main()
6060
6161
6262
### <a id="carries_dependency" href="#carries_dependency">`[[carries_dependency]]`属性</a>
63+
この属性はC++26で削除された。
64+
65+
[`memory_order_consume`](/reference/atomic/memory_order.md)順序付けを実装したC++処理系は存在せず、本属性の代替機能も提供されない。
66+
6367
`[[carries_dependency]]`は、並行プログラミングのアトミック操作において、値に依存した順序付け [`memory_order`](/reference/atomic/memory_order.md)を、関数をまたいで伝播することを明示するための属性である。
6468
6569
以下は、[`memory_order_consume`](/reference/atomic/memory_order.md)を使用した順序付けの例である:
@@ -179,4 +183,6 @@ C++11で採用されたもの以外で検討された以下の機能は、属性
179183
- [N2418 Towards support for attributes in C++ (Revision 3)](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2418.pdf)
180184
- [N2643 C++ Data-Dependency Ordering: Function Annotation](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2643.html)
181185
- [N2761 Towards support for attributes in C++ (Revision 6) ](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2761.pdf)
186+
- [P3475R2 Defang and deprecate memory_order::consume](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3475r2.pdf)
187+
- C++26で`memory_order::consume`非推奨化に伴い`carries_dependency`属性を削除。
182188
- [(抄訳)N4215 `memory_order_consume`の利用と実装に向けて[§5-6のみ]](http://d.hatena.ne.jp/yohhoy/20141115/p1)

reference/atomic/atomic/store.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ constexpr void
3535
## 事前条件
3636
`order`が以下のメモリオーダーではないこと:
3737
38-
- [`memory_order_consume`](/reference/atomic/memory_order.md)
38+
- [`memory_order_consume`](/reference/atomic/memory_order.md) (C++26で非推奨)
3939
- [`memory_order_acquire`](/reference/atomic/memory_order.md)
4040
- [`memory_order_acq_rel`](/reference/atomic/memory_order.md)
4141
@@ -96,3 +96,4 @@ int main()
9696
- C++20での、`volatile`版への制約追加
9797
- [P3309R3 `constexpr atomic` and `atomic_ref`](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3309r3.html)
9898
- C++26で`constexpr`に対応した
99+
- [P3475R2 Defang and deprecate memory_order::consume](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3475r2.pdf)

reference/atomic/atomic_flag/clear.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ constexpr void
2727
## 要件
2828
`order`が以下のメモリオーダーではないこと:
2929
30-
- [`memory_order_consume`](/reference/atomic/memory_order.md) (C++14)
30+
- [`memory_order_consume`](/reference/atomic/memory_order.md) (C++26で非推奨)
3131
- [`memory_order_acquire`](/reference/atomic/memory_order.md)
3232
- [`memory_order_acq_rel`](/reference/atomic/memory_order.md)
3333
@@ -97,3 +97,4 @@ false
9797
- [LWG Issue 2138. `atomic_flag::clear` should not accept `memory_order_consume`](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2138)
9898
- [P3309R3 `constexpr atomic` and `atomic_ref`](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3309r3.html)
9999
- C++26で`constexpr`に対応した
100+
- [P3475R2 Defang and deprecate memory_order::consume](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3475r2.pdf)

reference/atomic/atomic_flag_clear_explicit.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ namespace std {
3131
## 要件
3232
`order`が以下のメモリオーダーではないこと:
3333
34-
- [`memory_order_consume`](memory_order.md) (C++14)
34+
- [`memory_order_consume`](memory_order.md) (C++26で非推奨)
3535
- [`memory_order_acquire`](memory_order.md)
3636
- [`memory_order_acq_rel`](memory_order.md)
3737
@@ -102,3 +102,4 @@ false
102102
- [LWG Issue 2138. `atomic_flag::clear` should not accept `memory_order_consume`](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2138)
103103
- [P3309R3 `constexpr atomic` and `atomic_ref`](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3309r3.html)
104104
- C++26で`constexpr`に対応した
105+
- [P3475R2 Defang and deprecate memory_order::consume](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3475r2.pdf)

reference/atomic/atomic_ref/store.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ constexpr void
2727
## 事前条件
2828
`order`が以下のメモリオーダーではないこと:
2929
30-
- [`memory_order_consume`](/reference/atomic/memory_order.md)
30+
- [`memory_order_consume`](/reference/atomic/memory_order.md) (C++26で非推奨)
3131
- [`memory_order_acquire`](/reference/atomic/memory_order.md)
3232
- [`memory_order_acq_rel`](/reference/atomic/memory_order.md)
3333
@@ -88,3 +88,4 @@ int main()
8888
- C++26でCV修飾されたテンプレート引数を受け取れるようになった
8989
- [P3309R3 `constexpr atomic` and `atomic_ref`](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3309r3.html)
9090
- C++26で`constexpr`に対応した
91+
- [P3475R2 Defang and deprecate memory_order::consume](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3475r2.pdf)

reference/atomic/atomic_thread_fence.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ assert(i == 1 || j == 1); // すなわち、i と j が共に0となることは
8181
| メモリオーダー | フェンス |
8282
|---------------------------------------------|------------------------------------------------------------------|
8383
| [`memory_order_relaxed`](memory_order.md) | 何も行わない |
84-
| [`memory_order_acquire`](memory_order.md)<br/>[`memory_order_consume`](/reference/atomic/memory_order.md) | acquireフェンス |
84+
| [`memory_order_acquire`](memory_order.md) | acquireフェンス |
85+
| [`memory_order_consume`](memory_order.md) | acquireフェンス(C++26で非推奨) |
8586
| [`memory_order_release`](memory_order.md) | releaseフェンス |
8687
| [`memory_order_acq_rel`](memory_order.md) | acquireフェンスとreleaseフェンスの両方 |
8788
| [`memory_order_seq_cst`](memory_order.md) | acquireフェンスとreleaseフェンスの両方に加え、順序一貫性も与える |
@@ -149,3 +150,4 @@ int main()
149150
- [Implementing Dekker's algorithm with Fences](https://www.justsoftwaresolutions.co.uk/threading/implementing_dekkers_algorithm_with_fences.html)
150151
- [P3309R3 `constexpr atomic` and `atomic_ref`](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3309r3.html)
151152
- C++26で`constexpr`に対応した
153+
- [P3475R2 Defang and deprecate memory_order::consume](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3475r2.pdf)

reference/atomic/kill_dependency.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,22 @@
33
* std[meta namespace]
44
* function template[meta id-type]
55
* cpp11[meta cpp]
6+
* cpp26deprecated[meta cpp]
67

78
```cpp
89
namespace std {
910
template <class T>
1011
T kill_dependency(T y) noexcept; // (1) C++11
1112
template <class T>
12-
constexpr T kill_dependency(T y) noexcept; // (1) C++26
13+
constexpr T kill_dependency(T y) noexcept; // (1) C++26(非推奨)
1314
}
1415
```
1516
17+
この関数は、C++26で非推奨となった。
18+
19+
[`memory_order_consume`](memory_order.md)順序付けを実装したC++処理系は存在せず、本関数の代替機能も提供されない。
20+
21+
1622
## 概要
1723
データ依存性を切る。
1824
@@ -126,3 +132,5 @@ T kill_dependency(T y) noexcept
126132
- [(抄訳)N4215 `memory_order_consume`の利用と実装に向けて[§5-6のみ]](http://d.hatena.ne.jp/yohhoy/20141115/p1)
127133
- [P3309R3 `constexpr atomic` and `atomic_ref`](https://open-std.org/jtc1/sc22/wg21/docs/papers/2024/p3309r3.html)
128134
- C++26で`constexpr`に対応した
135+
- [P3475R2 Defang and deprecate memory_order::consume](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3475r2.pdf)
136+
- C++26で`memory_order::consume`とあわせて`kill_dependency`関数を非推奨化。

reference/atomic/memory_order.md

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,21 @@ namespace std {
2222
inline constexpr memory_order memory_order_release = memory_order::release;
2323
inline constexpr memory_order memory_order_acq_rel = memory_order::acq_rel;
2424
inline constexpr memory_order memory_order_seq_cst = memory_order::seq_cst;
25+
26+
// C++26
27+
enum class memory_order : unspecified {
28+
relaxed = 0, acquire = 2,
29+
release = 3, acq_rel = 4, seq_cst = 5
30+
};
31+
inline constexpr memory_order memory_order_relaxed = memory_order::relaxed;
32+
inline constexpr memory_order memory_order_acquire = memory_order::acquire;
33+
inline constexpr memory_order memory_order_release = memory_order::release;
34+
inline constexpr memory_order memory_order_acq_rel = memory_order::acq_rel;
35+
inline constexpr memory_order memory_order_seq_cst = memory_order::seq_cst;
2536
}
2637
```
38+
* unspecified[italic]
39+
2740
2841
## 概要
2942
コンパイラに許可されている最適化の一つに、「プログラムの意味を変えない限りにおいて、メモリアクセスの順番を変えたり、省略したりしてもよい」というものがある。また、マルチコアCPUにおいては、あるCPUコアによるメモリアクセスの順序が他のコアからも同じように見えるとは限らない。このような挙動はマルチスレッドプログラミングにおいて問題になることがある。
@@ -76,13 +89,18 @@ int main()
7689
| 列挙値 | 説明 |
7790
|--------|------|
7891
| `relaxed` | スレッド間の順序付けの効果は一切持たない。 |
79-
| `consume` | acquire操作と似ているが、それより弱い順序付けでの読み込みを行うことを指示する。acquire操作は後続の全ての操作に対して順序付けを行うのに対し、consume操作は読み込まれた値に依存(ただし条件分岐による依存は除く)する操作のみに順序付けを保証する点が異なる。[store()](atomic/store.md)など、書き込みのみを行う操作に対しては指定できない。(仕様検討中のため、一時的に非推奨) |
92+
| `consume` | C++26で非推奨 |
8093
| `acquire` | acquire操作としての読み込みを行うことを指示する。[store()](atomic/store.md)など、書き込みのみを行う操作に対しては指定できない。 |
8194
| `release` | release操作としての書き込みを行うことを指示する。[load()](atomic/load.md)など、読み込みのみを行う操作に対しては指定できない。 |
8295
| `acq_rel` | 読み込みと書き込みを同時に行う操作(Read-Modify-Write操作)に対してのみ指定することができ、acquireとreleaseを合わせた効果を持つ。 |
8396
| `seq_cst` | acquire(読み込み操作の場合)、release(書き込み操作の場合)、acq_rel(Read-Modify-Write操作の場合)としての効果を持つ。さらに、同じseq_cstが指定されている他のatomic操作との間での順序一貫性も保証する。これは最も強い保証であり、標準のatomic操作におけるデフォルトのメモリオーダーとして使用される。「seq_cst」は「sequential consistency(順序一貫性)」を意味する。 |
8497

8598

99+
## 備考
100+
非推奨化された`consume`列挙値の挙動はacquire操作と似ているが、それより弱い順序付けでの読み込みを行うことを指示する。acquire操作は後続の全ての操作に対して順序付けを行うのに対し、consume操作は読み込まれた値に依存(ただし条件分岐による依存は除く)する操作のみに順序付けを保証する点が異なる。
101+
複雑なconsume操作を正しく実装するC++コンパイラは登場せず、より単純なacquire操作として扱われていた。C++20では仕様再検討に伴う一時的な利用回避が宣言され、最終的には役に立たないとの判断からC++26で非推奨となった。
102+
103+
86104
## バージョン
87105
### 言語
88106
- C++11
@@ -102,5 +120,8 @@ int main()
102120
- [N1525: Memory-Order Rationale](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1525.htm)
103121
- [The Purpose of memory_order_consume in C++11](http://preshing.com/20140709/the-purpose-of-memory_order_consume-in-cpp11/)
104122
- [(抄訳)N4215 `memory_order_consume`の利用と実装に向けて[§5-6のみ]](http://d.hatena.ne.jp/yohhoy/20141115/p1)
105-
- [P0371R1 Temporarily discourage `memory_order_consume`](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0371r1.html)
106123
- [P0439R0 Make `std::memory_order` a scoped enumeration](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0439r0.html)
124+
- C++20で`memory_order`をスコープ付き列挙型に変更。
125+
- [P0371R1 Temporarily discourage `memory_order_consume`](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0371r1.html)
126+
- [P3475R2 Defang and deprecate memory_order::consume](https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3475r2.pdf)
127+
- C++26で`memory_order::consume`列挙子を非推奨化。

0 commit comments

Comments
 (0)