私はマルチスレッドアプリケーションで共有データとしてstd :: vectorを使用しています。私は、例えば、std :: thread、thread-safety、multi-threading
class ABC {
public:
double a, b, c;
};
boost::mutex mutex1;
class XYZ {
public:
XYZ(vector<ABC> & pVector) {
ptrVector = &pVector;
m_thread = boost::thread(&XYZ::Start, this);
}
~XYZ() {}
void Start();
public:
vector<ABC> * ptrVector;
boost::thread m_thread;
};
void XYZ::Start() {
try {
while(1) {
boost::this_thread::interruption_point();
for (unsigned int i=0; i<ptrVector->size(); i++) {
{
boost::mutex::scoped_lock lock(mutex1);
ptrVector->at(i).a = double(rand())/10000;
ptrVector->at(i).b = double(rand())/10000;
ptrVector->at(i).c = double(rand())/10000;
}
}
}
}
catch(boost::thread_interrupted) {}
catch(std::exception) {}
}
Iは時々アプリケーション、を閉じると、デバッグ中に、は時々エラーメッセージが存在しないであろう2つのエラーメッセージが存在するであろう、クラス内のスレッドをカプセル化します。私はしばしば、std :: vectorがスレッドセーフではないという話を聞いたことがありますが、これはケースの1つですか?私はVisual Studio 2008を使用して、スレッドをブーストして、ベクトルのサイズが固定されています。誰もマルチスレッドアプリケーションでstd :: vectorを使用する方法についてアドバイスを提供することができますか? ETP.exeで0x7688b9bcで
- 初回例外:マイクロソフトC++ 例外:メモリ位置0x02d8f7bcでのstd :: out_of_range .. ETP.exeで0x00e916e0で
- 初回例外:0xc0000005で:アクセス 違反の読書場所は0x00000008です。
- セカンドチャンスアサーションが失敗しました:ファイルC:\プログラムファイル (のx86)をマイクロソフトのVisual Studio 9.0 \ VCの\ \ \ベクトルが含まれ、ラインセカンド チャンスアサーションは失敗しました:ファイルC:\プログラムファイル(x86の)をマイクロソフト のビジュアル\ studio 9.0 \ vc \ include \ vector98
ありがとうございます。
ベクトルは、スレッドセーフではありません。あなたはそれをロックしています、そして、あなたがそれをどのように使用しているかを見るための他のコードなしで、何がうまくいかないかもしれないと言うことは不可能です。この特定のコードは、それだけで正常に見えます。 – Jarryd
スレッドの安全性とは別に、スレッドがベクトルにアクセスする順序を考慮する必要もあります。あるスレッドがベクトルから読み込んでいる場合は、別のスレッドがそのベクトルの前にベクトルに書き込まれていることを確認する必要がありますコードは、ベクトルが書き込まれていない条件を処理する必要があります。 –
@Jarrydあなたはこのコードで、mutexを使ってベクトルをロックしているようですが、もしそうなら、問題は起こらないはずです。詳細については、完全なコードを参照してください。 –