質問:
複数のスレッドが同時に Push_back を呼び出すことはできますか?スレッドの安全性を損なうことなく、共有 std::vector オブジェクトの () メソッドを実行できますか?それとも、ユーザーは追加の同期メカニズムを実装する必要がありますか?
回答:
一般的な想定に反して、標準の C ベクトル (std::vector) とブースト ベクター (boost::vector) は、C に準拠した限定的なスレッドの安全性保証を提供します。標準。
スレッドの安全性の保証:
これらの保証は、スレッド セーフに対する一般的な期待と一致しない可能性がありますが、標準コンテナの設計を考慮すると合理的です。 、シングルスレッドシナリオでの効率的なアクセスを優先します。メソッドにロック メカニズムを組み込むと、この効率が妨げられます。
外部ロック:
複数のスレッドがコンテナに同時にアクセスするときに完全なスレッドの安全性を確保するには、外部同期メカニズムを実装する必要があります。 。特定の要件は、C 標準のセクション 17.6.4.10 [res.on.objects] 段落 1 で概説されています。
ブースト ベクターの考慮事項:
スレッドの安全性の保証ブースト ベクターのインターフェイスが類似しているため、標準ベクターのベクターと同一であることが期待されます。ただし、安全な同時アクセスを保証するには、やはり外部ロックが必要です。
結論:
標準の C および Boost ベクトルは特定のスレッドの安全性を保証しますが、制限されています。マルチスレッド シナリオでスレッドの安全性を完全に確保するには、データ競合を防ぐために外部同期メカニズムを採用する必要があります。
以上が標準 C およびブースト ベクターは、同時実行の `push_back()` 操作に対してスレッドセーフですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。