0

がありboost::shared_ptr<Map>、このマップは複数のスレッドによって変更されています。明示的なミューテックスを使用する必要がありますか?それとも、スレッドが共有ポインターを介してマップを変更しているという事実だけで、何らかの暗黙的なスレッド セーフが得られますか?

4

2 に答える 2

2

ドキュメントも見ましたか?

shared_ptr オブジェクトは、組み込み型と同じレベルのスレッド セーフを提供します。shared_ptr インスタンスは、複数のスレッドで同時に「読み取る」(const 操作のみを使用してアクセスする) ことができます。異なる shared_ptr インスタンスは、複数のスレッドによって同時に「書き込み」(operator= や reset などの変更可能な操作を使用してアクセス) できます (これらのインスタンスがコピーであり、その下で同じ参照カウントを共有している場合でも)。

それ以外の同時アクセスは、未定義の動作を引き起こします。

編集:ポインタ自体ではなく、指しているオブジェクトについて質問しているようです。その場合、スレッドセーフ保証はまったくありません。なぜあるのでしょうか?

于 2012-08-23T23:56:30.660 に答える
1

shared_ptr組み込み型と同じレベルのスレッド セーフを備えています。

複数のスレッドから同時に読み取り (const) 操作を実行できます。

また、複数のスレッドから同時に異なるインスタンスに対して書き込み操作 (つまり、operator=またはなどの変更可能な操作を使用) を実行することもできます。これには、これらのインスタンスが同じ参照カウントを共有する場合が含まれます (参照カウンターのアトミック インクリメント/デクリメントを提供するため)。resetshared_ptrshared_ptr

他のタイプのアクセスが必要な場合は、それを同期する必要があります。そうしないと、未定義の動作が発生します。

于 2012-08-23T23:56:48.023 に答える