1. ホーム
  2. c++

[解決済み] std::shared_ptr に相当する非アトミックなものはあるのでしょうか?また、なぜ <memory> にはないのでしょうか?

2022-12-23 07:18:52

質問

これは少し2つの部分に分かれた質問で、すべて std::shared_ptr :

1. 私が知る限りでは std::shared_ptr の中で唯一のスマートポインタです。 <memory> の中で唯一アトミックなものです。アトミックでないバージョンの std::shared_ptr が利用可能かどうか(私は <memory> にあるような、標準外の提案も歓迎です)。私が知っているのは boost::shared_ptr はアトミックでもあります(もし BOOST_SP_DISABLE_THREADS が定義されていない場合)、しかし、多分他の代替手段があるのでは?と同じセマンティクスを持つものを探しています。 std::shared_ptr と同じセマンティクスを持つが、原子性はないものを探しています。

2. なぜかわかる std::shared_ptr がアトミックである理由は理解できます。しかし、それはすべての状況にとって良いことではなく、C++ は歴史的に「使った分だけ支払う」というマントラを持っています。複数のスレッドを使用していない場合、または複数のスレッドを使用しているがスレッド間でポインタの所有権を共有していない場合、原子スマート ポインタは過剰なものです。2 つ目の質問は の非アトミックバージョンがなかったのはなぜですか? std::shared_ptr は C++11 で提供されなかったのでしょうか。 ? (があると仮定して)。 なぜ ) (その答えが単に "非原子バージョンは単に考慮されなかった" または "誰も非原子バージョンを要求しなかった" であれば、それはそれで結構です!) 。

質問 2 では、誰かが shared_ptr (の原子版を置き換えるためではなく)(Boost または標準化委員会に対して)。 shared_ptr を置き換えるのではなく、それと共存するため)、そしてそれは特定の理由のために撃墜されました。

どのように解決するのですか?

<ブロッククオート

1. 私はstd::shared_ptrの非アトミックバージョンが利用可能であるかどうかを疑問に思っている

標準では提供されていません。 サードパーティのライブラリによって提供されているものがあるかもしれません。 実際、C++11 より前、および Boost より前は、誰もが独自の参照カウントされたスマート ポインターを書いていたように思います (私を含めて)。

2. 私の 2 番目の質問は、なぜ std::shared_ptr の非アトミック バージョンが C++11 で提供されなかったのでしょうか?

この質問は、2010 年の Rapperswil 会議で議論されました。 このテーマは、スイスの国別団体コメント #20 によって導入されました。 あなたが質問で提供したものを含め、議論の両側で強い主張がありました。 しかし、議論の最後には、非同期化 (非アトミック) 版の shared_ptr .

反対意見も含む。

  • 非同期shared_ptrで書かれたコードは、将来スレッド化されたコードで使用され、警告もなくデバッグが困難な問題を引き起こしてしまうかもしれません。

  • 参照カウントでトラフィックするための 1 つの "universal" shared_ptr を持つことは、利点があります。 以下から 元の提案 :

    使用する機能に関係なく同じオブジェクトタイプを持つため、サードパーティライブラリを含むライブラリ間の相互運用が非常に容易になる。

  • アトミックのコストは、ゼロではありませんが、圧倒的なものではありません。 このコストは、アトミック操作を使用する必要がない移動構築と移動割り当てを使用することで軽減されます。 このような操作は、一般的に vector<shared_ptr<T>> erase と insert でよく使用されます。

  • 本当にそうしたいのであれば、人々が独自の非原子参照カウントのスマートポインタを書くことを禁止するものはありません。

その日、RapperswilにあるLWGからの最後の言葉はこうでした。

CH20を拒否する。現時点では変更を行うためのコンセンサスはない。