重複の可能性:
stl ベクトルの同時読み取りはスレッドセーフですか?
一定量のワーカーを持つマルチスレッド プログラムがあります。各ワーカーには、本質的にそのスレッドの一意の整数である「workerID」があります。これらのスレッドを管理するために、構造体のベクトルを使用したいと考えています。私の質問は、スレッド 8 が myVector[8] にアクセスしたいのと同時に、スレッド 4 が myVector[4] にアクセスしたい場合、問題が発生するのでしょうか?
重複の可能性:
stl ベクトルの同時読み取りはスレッドセーフですか?
一定量のワーカーを持つマルチスレッド プログラムがあります。各ワーカーには、本質的にそのスレッドの一意の整数である「workerID」があります。これらのスレッドを管理するために、構造体のベクトルを使用したいと考えています。私の質問は、スレッド 8 が myVector[8] にアクセスしたいのと同時に、スレッド 4 が myVector[4] にアクセスしたい場合、問題が発生するのでしょうか?
マルチスレッド シナリオに入る前にベクトルを設定し、それを変更せずに複数のスレッドからベクトルを読み取るだけの場合、それはスレッド セーフです。2 つ以上のスレッドから同時に同じ要素を読み取ることもできますが、どのスレッドもベクトルを変更しないようにしてください。ベクトルとそのすべての要素を読み取り専用として扱います。
ただし、変更の場合、標準ライブラリのコンテナーはどれもスレッドセーフではありません。同期を自分で実装する必要があります。
C++11 では多くの同期プリミティブが導入されているため、コンパイラがサポートしている場合はそれらを使用できます。
いいえ。スレッド間でのベクトル クラスの管理は安全ではありませんstd::vector<>
。インスタンスへの読み取り/書き込みアクセスを保護するために、何らかの同期メカニズム (ミューテックスなど) を使用する必要があります。
一般的に言えば、std::vector はスレッドセーフではありません。しかし、あなたがやりたいことは安全です。複数のスレッドでベクトルを読み取るだけの場合、これは機能します。各スレッドが独自のオフセットにのみ書き込む場合にも機能します。確実に機能しないのは、スレッド内でベクトルのサイズ変更などを開始した場合、または複数のスレッドが同じオフセットに書き込みたい場合です。
同じ要素を使用しない限り、問題はありません (afaik)。
しかし、彼らが何かを削除したり、何かをプッシュバックしたりすると、それは悪い考えです。
安全のために、ロックを使用してください。