Skip to content

Commit

Permalink
P0718R2のshared_ptrのアトミックフリー関数非推奨を適用
Browse files Browse the repository at this point in the history
  • Loading branch information
onihusube committed Jun 13, 2023
1 parent 5ae2c39 commit 90927bc
Show file tree
Hide file tree
Showing 12 changed files with 153 additions and 31 deletions.
22 changes: 11 additions & 11 deletions reference/memory/shared_ptr.md
Expand Up @@ -81,17 +81,17 @@ namespace std {
| 名前 | 説明 | 対応バージョン |
|-------------------------------------------|--------------------------------------------------|-------|
| [`atomic_is_lock_free`][is_lock_free] | 指定されたオブジェクトがロックフリーに振る舞えるかを調べる | C++11 |
| [`atomic_store`][store] | 値を書き込む | C++11 |
| [`atomic_store_explicit`][store_ex] | メモリオーダーを指定して値を書き込む | C++11 |
| [`atomic_load`][load] | 値を読み込む | C++11 |
| [`atomic_load_explicit`][load_ex] | メモリオーダーを指定して値を読み込む | C++11 |
| [`atomic_exchange`][exchange] | 値を入れ替える | C++11 |
| [`atomic_exchange_explicit`][exchange_ex] | メモリオーダーを指定して値を入れ替える | C++11 |
| [`atomic_compare_exchange_weak`][exchange_weak] | 弱い比較で値の入れ替えを行う | C++11 |
| [`atomic_compare_exchange_strong`][exchange_strong] | 強い比較で値の入れ替えを行う | C++11 |
| [`atomic_compare_exchange_weak_explicit`][exchange_weak_ex] | 弱い比較でメモリオーダーを指定して値の入れ替えを行う | C++11 |
| [`atomic_compare_exchange_strong_explicit`][exchange_strong_ex] | 強い比較でメモリオーダーを指定して値の入れ替えを行う | C++11 |
| [`atomic_is_lock_free`][is_lock_free] | 指定されたオブジェクトがロックフリーに振る舞えるかを調べる | C++11<br/> C++20から非推奨 |
| [`atomic_store`][store] | 値を書き込む | C++11<br/> C++20から非推奨 |
| [`atomic_store_explicit`][store_ex] | メモリオーダーを指定して値を書き込む | C++11<br/> C++20から非推奨 |
| [`atomic_load`][load] | 値を読み込む | C++11<br/> C++20から非推奨 |
| [`atomic_load_explicit`][load_ex] | メモリオーダーを指定して値を読み込む | C++11<br/> C++20から非推奨 |
| [`atomic_exchange`][exchange] | 値を入れ替える | C++11<br/> C++20から非推奨 |
| [`atomic_exchange_explicit`][exchange_ex] | メモリオーダーを指定して値を入れ替える | C++11<br/> C++20から非推奨 |
| [`atomic_compare_exchange_weak`][exchange_weak] | 弱い比較で値の入れ替えを行う | C++11<br/> C++20から非推奨 |
| [`atomic_compare_exchange_strong`][exchange_strong] | 強い比較で値の入れ替えを行う | C++11<br/> C++20から非推奨 |
| [`atomic_compare_exchange_weak_explicit`][exchange_weak_ex] | 弱い比較でメモリオーダーを指定して値の入れ替えを行う | C++11<br/> C++20から非推奨 |
| [`atomic_compare_exchange_strong_explicit`][exchange_strong_ex] | 強い比較でメモリオーダーを指定して値の入れ替えを行う | C++11<br/> C++20から非推奨 |
[is_lock_free]: shared_ptr/atomic_is_lock_free.md
[store]: shared_ptr/atomic_store.md
Expand Down
15 changes: 13 additions & 2 deletions reference/memory/shared_ptr/atomic_compare_exchange_strong.md
Expand Up @@ -3,6 +3,7 @@
* std[meta namespace]
* function template[meta id-type]
* cpp11[meta cpp]
* cpp20deprecated[meta cpp]

```cpp
namespace std {
Expand All @@ -12,6 +13,8 @@ namespace std {
}
```
この関数は、C++20から非推奨となった。アトミックアクセスの対象としている`shared_ptr`を[`shared_ptr`に対する`atomic`特殊化](/reference/memory/atomic.md)で置き換えることで同等の機能を使用できる。
## 概要
強い比較で、アトミックに`shared_ptr`オブジェクトを入れ替える。
Expand All @@ -37,6 +40,15 @@ atomic_compare_exchange_strong_explicit(
## 例外
投げない

## 非推奨・削除の詳細

この関数はフリー関数であるため、この関数によってアトミックにアクセスする対象となる`shared_ptr`オブジェクトそのものはどこかに配置されている非アトミックオブジェクトである。そのため、アトミックアクセスしたい文脈の外側から通常のアクセスが可能であり、もし別のスレッドからそのようなアクセスが行われているとこの関数を用いていてもデータ競合を引き起こし未定義動作となる。

すなわち、アトミックにアクセスしたい`shared_ptr`オブジェクトに対する全てのアクセスをプログラマがきちんと管理しなければこの関数の使用は安全ではなく、それはかなり困難であったためこの関数は危険な利用がデフォルトとなっていた。

そのため、この関数(とそのファミリ)は非推奨とされ、代わりに[`shared_ptr`に対する`atomic`特殊化](/reference/memory/atomic.md)が追加された。`shared_ptr`に対する`atomic`特殊化を利用すれば、アトミックにアクセスする対象となる`shared_ptr`オブジェクトそのものをアトミックオブジェクトとすることができるため、どこからアクセスしたとしても全てのアクセスは自動的にアトミックアクセスとなり、前述の問題は回避できる。

この関数から`shared_ptr`に対する`atomic`特殊化に移行する場合は、元のコードでアトミックアクセス対象となっていた`shared_ptr`オブジェクトの型を`std::atomic<std::shared_ptr>`に変更することで移行でき、その場合は`atomic`のために用意されているフリー関数が代わりに使用される(宣言されているヘッダが異なるため、`<atomic>`ヘッダのインクルードが必要となるかもしれない)。

##
```cpp example
Expand Down Expand Up @@ -81,5 +93,4 @@ int main()
- [N2674 Shared_ptr atomic access, revision 1](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2674.htm)
- [C++0x Shared_ptr atomic access - Faith and Brave - C++で遊ぼう](http://faithandbrave.hateblo.jp/entry/20081015/1224066366)
- [LWG Issue 2172. Does `atomic_compare_exchange_*` accept `v == nullptr` arguments?](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2172)


- [P0718R2 Revising `atomic_shared_ptr` for C++20](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0718r2.html)
Expand Up @@ -3,6 +3,7 @@
* std[meta namespace]
* function template[meta id-type]
* cpp11[meta cpp]
* cpp20deprecated[meta cpp]

```cpp
namespace std {
Expand All @@ -14,6 +15,8 @@ namespace std {
```
* memory_order[link /reference/atomic/memory_order.md]
この関数は、C++20から非推奨となった。アトミックアクセスの対象としている`shared_ptr`を[`shared_ptr`に対する`atomic`特殊化](/reference/memory/atomic.md)で置き換えることで同等の機能を使用できる。
## 概要
メモリオーダーを指定して、強い比較で、アトミックに`shared_ptr`オブジェクトを入れ替える。
Expand Down Expand Up @@ -43,6 +46,15 @@ namespace std {
## 備考
等値比較は、2つの`shared_ptr`オブジェクトが同じポインタを保持し、リソースを共有していれば`true`となる。
## 非推奨・削除の詳細
この関数はフリー関数であるため、この関数によってアトミックにアクセスする対象となる`shared_ptr`オブジェクトそのものはどこかに配置されている非アトミックオブジェクトである。そのため、アトミックアクセスしたい文脈の外側から通常のアクセスが可能であり、もし別のスレッドからそのようなアクセスが行われているとこの関数を用いていてもデータ競合を引き起こし未定義動作となる。
すなわち、アトミックにアクセスしたい`shared_ptr`オブジェクトに対する全てのアクセスをプログラマがきちんと管理しなければこの関数の使用は安全ではなく、それはかなり困難であったためこの関数は危険な利用がデフォルトとなっていた。
そのため、この関数(とそのファミリ)は非推奨とされ、代わりに[`shared_ptr`に対する`atomic`特殊化](/reference/memory/atomic.md)が追加された。`shared_ptr`に対する`atomic`特殊化を利用すれば、アトミックにアクセスする対象となる`shared_ptr`オブジェクトそのものをアトミックオブジェクトとすることができるため、どこからアクセスしたとしても全てのアクセスは自動的にアトミックアクセスとなり、前述の問題は回避できる。
この関数から`shared_ptr`に対する`atomic`特殊化に移行する場合は、元のコードでアトミックアクセス対象となっていた`shared_ptr`オブジェクトの型を`std::atomic<std::shared_ptr>`に変更することで移行でき、その場合は`atomic`のために用意されているフリー関数が代わりに使用される(宣言されているヘッダが異なるため、`<atomic>`ヘッダのインクルードが必要となるかもしれない)。
## 例
```cpp example
Expand Down Expand Up @@ -93,5 +105,4 @@ int main()
- [N2674 Shared_ptr atomic access, revision 1](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2674.htm)
- [C++0x Shared_ptr atomic access - Faith and Brave - C++で遊ぼう](http://faithandbrave.hateblo.jp/entry/20081015/1224066366)
- [LWG Issue 2172. Does `atomic_compare_exchange_*` accept `v == nullptr` arguments?](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2172)


- [P0718R2 Revising `atomic_shared_ptr` for C++20](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0718r2.html)
14 changes: 13 additions & 1 deletion reference/memory/shared_ptr/atomic_compare_exchange_weak.md
Expand Up @@ -3,6 +3,7 @@
* std[meta namespace]
* function template[meta id-type]
* cpp11[meta cpp]
* cpp20deprecated[meta cpp]

```cpp
namespace std {
Expand All @@ -12,6 +13,8 @@ namespace std {
}
```
この関数は、C++20から非推奨となった。アトミックアクセスの対象としている`shared_ptr`を[`shared_ptr`に対する`atomic`特殊化](/reference/memory/atomic.md)で置き換えることで同等の機能を使用できる。
## 概要
弱い比較で、アトミックに`shared_ptr`オブジェクトを入れ替える。
Expand All @@ -37,6 +40,15 @@ atomic_compare_exchange_weak_explicit(
## 例外
投げない

## 非推奨・削除の詳細

この関数はフリー関数であるため、この関数によってアトミックにアクセスする対象となる`shared_ptr`オブジェクトそのものはどこかに配置されている非アトミックオブジェクトである。そのため、アトミックアクセスしたい文脈の外側から通常のアクセスが可能であり、もし別のスレッドからそのようなアクセスが行われているとこの関数を用いていてもデータ競合を引き起こし未定義動作となる。

すなわち、アトミックにアクセスしたい`shared_ptr`オブジェクトに対する全てのアクセスをプログラマがきちんと管理しなければこの関数の使用は安全ではなく、それはかなり困難であったためこの関数は危険な利用がデフォルトとなっていた。

そのため、この関数(とそのファミリ)は非推奨とされ、代わりに[`shared_ptr`に対する`atomic`特殊化](/reference/memory/atomic.md)が追加された。`shared_ptr`に対する`atomic`特殊化を利用すれば、アトミックにアクセスする対象となる`shared_ptr`オブジェクトそのものをアトミックオブジェクトとすることができるため、どこからアクセスしたとしても全てのアクセスは自動的にアトミックアクセスとなり、前述の問題は回避できる。

この関数から`shared_ptr`に対する`atomic`特殊化に移行する場合は、元のコードでアトミックアクセス対象となっていた`shared_ptr`オブジェクトの型を`std::atomic<std::shared_ptr>`に変更することで移行でき、その場合は`atomic`のために用意されているフリー関数が代わりに使用される(宣言されているヘッダが異なるため、`<atomic>`ヘッダのインクルードが必要となるかもしれない)。

##
```cpp example
Expand Down Expand Up @@ -80,4 +92,4 @@ int main()
- [N2674 Shared_ptr atomic access, revision 1](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2674.htm)
- [C++0x Shared_ptr atomic access - Faith and Brave - C++で遊ぼう](http://faithandbrave.hateblo.jp/entry/20081015/1224066366)
- [LWG Issue 2172. Does `atomic_compare_exchange_*` accept `v == nullptr` arguments?](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2172)

- [P0718R2 Revising `atomic_shared_ptr` for C++20](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0718r2.html)
Expand Up @@ -3,6 +3,7 @@
* std[meta namespace]
* function template[meta id-type]
* cpp11[meta cpp]
* cpp20deprecated[meta cpp]

```cpp
namespace std {
Expand All @@ -14,6 +15,8 @@ namespace std {
```
* memory_order[link /reference/atomic/memory_order.md]
この関数は、C++20から非推奨となった。アトミックアクセスの対象としている`shared_ptr`を[`shared_ptr`に対する`atomic`特殊化](/reference/memory/atomic.md)で置き換えることで同等の機能を使用できる。
## 概要
メモリオーダーを指定して、弱い比較で、アトミックに`shared_ptr`オブジェクトを入れ替える。
Expand Down Expand Up @@ -43,6 +46,15 @@ namespace std {
## 備考
等値比較は、2つの`shared_ptr`オブジェクトが同じポインタを保持し、リソースを共有していれば`true`となる。
## 非推奨・削除の詳細
この関数はフリー関数であるため、この関数によってアトミックにアクセスする対象となる`shared_ptr`オブジェクトそのものはどこかに配置されている非アトミックオブジェクトである。そのため、アトミックアクセスしたい文脈の外側から通常のアクセスが可能であり、もし別のスレッドからそのようなアクセスが行われているとこの関数を用いていてもデータ競合を引き起こし未定義動作となる。
すなわち、アトミックにアクセスしたい`shared_ptr`オブジェクトに対する全てのアクセスをプログラマがきちんと管理しなければこの関数の使用は安全ではなく、それはかなり困難であったためこの関数は危険な利用がデフォルトとなっていた。
そのため、この関数(とそのファミリ)は非推奨とされ、代わりに[`shared_ptr`に対する`atomic`特殊化](/reference/memory/atomic.md)が追加された。`shared_ptr`に対する`atomic`特殊化を利用すれば、アトミックにアクセスする対象となる`shared_ptr`オブジェクトそのものをアトミックオブジェクトとすることができるため、どこからアクセスしたとしても全てのアクセスは自動的にアトミックアクセスとなり、前述の問題は回避できる。
この関数から`shared_ptr`に対する`atomic`特殊化に移行する場合は、元のコードでアトミックアクセス対象となっていた`shared_ptr`オブジェクトの型を`std::atomic<std::shared_ptr>`に変更することで移行でき、その場合は`atomic`のために用意されているフリー関数が代わりに使用される(宣言されているヘッダが異なるため、`<atomic>`ヘッダのインクルードが必要となるかもしれない)。
## 例
```cpp example
Expand Down Expand Up @@ -91,5 +103,4 @@ int main()
- [N2674 Shared_ptr atomic access, revision 1](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2674.htm)
- [C++0x Shared_ptr atomic access - Faith and Brave - C++で遊ぼう](http://faithandbrave.hateblo.jp/entry/20081015/1224066366)
- [LWG Issue 2172. Does `atomic_compare_exchange_*` accept `v == nullptr` arguments?](http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#2172)


- [P0718R2 Revising `atomic_shared_ptr` for C++20](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0718r2.html)
15 changes: 13 additions & 2 deletions reference/memory/shared_ptr/atomic_exchange.md
Expand Up @@ -3,6 +3,7 @@
* std[meta namespace]
* function template[meta id-type]
* cpp11[meta cpp]
* cpp20deprecated[meta cpp]

```cpp
namespace std {
Expand All @@ -11,6 +12,8 @@ namespace std {
}
```
この関数は、C++20から非推奨となった。アトミックアクセスの対象としている`shared_ptr`を[`shared_ptr`に対する`atomic`特殊化](/reference/memory/atomic.md)で置き換えることで同等の機能を使用できる。
## 概要
`shared_ptr`オブジェクトを、アトミックに入れ替える。
Expand All @@ -30,6 +33,15 @@ atomic_exchange_explicit(p, r, memory_order_seq_cst)
## 例外
投げない

## 非推奨・削除の詳細

この関数はフリー関数であるため、この関数によってアトミックにアクセスする対象となる`shared_ptr`オブジェクトそのものはどこかに配置されている非アトミックオブジェクトである。そのため、アトミックアクセスしたい文脈の外側から通常のアクセスが可能であり、もし別のスレッドからそのようなアクセスが行われているとこの関数を用いていてもデータ競合を引き起こし未定義動作となる。

すなわち、アトミックにアクセスしたい`shared_ptr`オブジェクトに対する全てのアクセスをプログラマがきちんと管理しなければこの関数の使用は安全ではなく、それはかなり困難であったためこの関数は危険な利用がデフォルトとなっていた。

そのため、この関数(とそのファミリ)は非推奨とされ、代わりに[`shared_ptr`に対する`atomic`特殊化](/reference/memory/atomic.md)が追加された。`shared_ptr`に対する`atomic`特殊化を利用すれば、アトミックにアクセスする対象となる`shared_ptr`オブジェクトそのものをアトミックオブジェクトとすることができるため、どこからアクセスしたとしても全てのアクセスは自動的にアトミックアクセスとなり、前述の問題は回避できる。

この関数から`shared_ptr`に対する`atomic`特殊化に移行する場合は、元のコードでアトミックアクセス対象となっていた`shared_ptr`オブジェクトの型を`std::atomic<std::shared_ptr>`に変更することで移行でき、その場合は`atomic`のために用意されているフリー関数が代わりに使用される(宣言されているヘッダが異なるため、`<atomic>`ヘッダのインクルードが必要となるかもしれない)。

##
```cpp example
Expand Down Expand Up @@ -71,5 +83,4 @@ int main()
- [`atomic_exchange() - <atomic>`](/reference/atomic/atomic_exchange.md)
- [N2674 Shared_ptr atomic access, revision 1](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2674.htm)
- [C++0x Shared_ptr atomic access - Faith and Brave - C++で遊ぼう](http://faithandbrave.hateblo.jp/entry/20081015/1224066366)


- [P0718R2 Revising `atomic_shared_ptr` for C++20](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0718r2.html)

0 comments on commit 90927bc

Please sign in to comment.