完全にスレッドセーフなshared_ptr
実装を知っている人はいますか? たとえば、ブーストの実装はshared_ptr
、ターゲット (refcounting) に対してスレッドセーフであり、同時shared_ptr
インスタンス読み取りに対しても安全ですが、書き込みまたは読み取り/書き込みに対しては安全ではありません。
( Boost docsの例 3、4、および 5 を参照してください)。
shared_ptr
インスタンスに対して完全にスレッドセーフな shared_ptr 実装はありますか?
奇妙なブースト ドキュメントは次のように述べています。
shared_ptr オブジェクトは、組み込み型と同じレベルのスレッド セーフを提供します。
しかし、通常のポインター (組み込み型) を と比較すると、通常のポインターsmart_ptr
の同時書き込みはスレッドセーフですが、 への同時書き込みはそうでsmart_ptr
はありません。
編集: x86 アーキテクチャでのロックフリーの実装を意味します。
EDIT2: このようなスマート ポインターの使用例は、現在の作業項目でグローバル shared_ptr を更新する多数のワーカー スレッドと、作業項目のランダム サンプルを取得するモニター スレッドがある場合です。shared-ptr は、別の作業項目ポインターが割り当てられるまで (それによって前の作業項目を破棄する) 作業項目を所有します。モニターは、ワークアイテムを独自の shared-ptr に割り当てることにより、ワークアイテムの所有権を取得します (それにより、ワークアイテムが破棄されるのを防ぎます)。XCHG と手動削除で実行できますが、shared-ptr で実行できると便利です。
もう 1 つの例は、グローバル shared-ptr が「プロセッサ」を保持し、あるスレッドによって割り当てられ、他のスレッドによって使用される場合です。「ユーザー」スレッドは、プロセッサの shard-ptr が NULL であることを確認すると、代替ロジックを使用して処理を行います。NULL でない場合は、プロセッサを独自の shared-ptr に割り当てることで、プロセッサが破壊されるのを防ぎます。