2

高度にマルチスレッド化されたプログラムがあり、侵入型のオブジェクトのリンク リストが含まれています。このリスト内のオブジェクトを複数のスレッドに渡す必要がありますが、一度にオブジェクトを所有するスレッドは 1 つだけです。つまり、このオブジェクトまたはそのポインターを共有する必要はありません。

ブーストを使用してunique_ptrを使用して侵入型リストを作成したかったのですが、読んだところ、unique_ptrは適切な所有権セマンティクスを持たないため、Boost侵入型ライブラリと互換性がありません。

これにより、侵入型ライブラリでは、その要素 (ポインター) が生のポインターと同じ所有権セマンティクスを持つ必要があります。したがって、unique_ptr や shared_ptr でさえ資格がありません。

邪魔なリストを最適に実装する方法について、誰かがアドバイスをくれないかと思ったので、その要素を複数のスレッドに安全に渡し、それらがそのスレッドに移動され、スレッド間で共有されていないことを知ることができますか?

4

1 に答える 1

1

私が従う限り、これが機能するには、何らかの自動リンク解除フックが必要です。

侵入型コンテナは、それに含まれるオブジェクトを所有していないため、unique_ptrs が参照する生のポインタを侵入型コンテナに追加しても問題はありません。

侵入リストの生のポインターから実際の unique_ptr にアクセスできるようにする必要がある場合は、enable_shared_from_thisの行に沿った何かが役立つかもしれません。(侵入型のコンテナーを侵入型の unique_ptr と組み合わせる必要があります。)


少し考えてみると、スマートポインターの「侵入」部分は通常参照カウントであり、unique_ptr のようなオブジェクトには参照カウントがないため、実際には侵入的な unique_ptr バリアントは存在しないようです。

おそらく、これには shared_ptr を使用するのが最善でしょう。

于 2010-10-07T09:35:57.233 に答える