私は2つのスレッド(ブーストスレッドライブラリを使用)とグローバルベクトルをWindows上に持っています(Visual Studio 2005)。私はスレッドを作成しました - 最初にファイル(vector.push_back(value)
)を読み込み、 "読み込みカウンター"を増やしています。もう1つはすでに読み込まれたデータを処理しています(2番目の "ポインタ"はすでに処理されたベクトルのインデックスを記憶しています)。処理は次のようなものですvector[i] = function(vector[i]);
ベクトルを同時に読み書きすると例外が発生する
プログラムを起動すると、例外が発生します。Unhandled exception at 0x0041350c in program.exe: 0xC0000005: Access violation writing location 0x00b82214.
読み取りカウンタの値がレコードの数より少なく(ファイルを読み込んでいます)、vector.size()が "readCounter + 1"ポインタ "+/- 2200(はるかに少ないカウンタを読み取り、空の値を読み取る際には問題ありません)...値は実行ごとに異なります(例外はスローされずにプログラムが終了する場合もあります)...
処理を削除すると行(vector[i] = function(vector[i]);
)問題は発生しません...私は推測するので、ベクトルはスレッドセーフではありません。この問題を防ぐ方法を教えてください。
は、ほとんどの場合に必要とされていない大きなオーバーヘッドが追加されます。 *標準ライブラリはスレッドセーフではないと常に仮定すべきです。 –