我正在使用std :: vector作爲多線程應用程序中的共享數據。我封裝螺紋的類中,例如,std ::向量,線程安全,多線程
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) {}
}
當我關閉應用程序,有時,在調試,會有2個錯誤消息,有時會有任何錯誤消息。我經常聽到人們在談論std :: vector不是線程安全的,這是這種情況之一嗎?我正在使用Visual Studio 2008,boost線程,矢量的大小是固定的。任何人都可以提供一些關於如何在多線程應用程序中使用std :: vector的建議。在ETP.exe 0x7688b9bc
- 第一次機會異常:微軟C++ 例外:的std :: out_of_range內存位置0x02d8f7bc ..在ETP.exe 0x00e916e0
- 第一次機會異常:0000005:訪問 違規閱讀地點0x00000008。
- 第二次機會斷言失敗:文件C:\ Program Files文件 (x86)的\微軟的Visual Studio 9.0 \ VC \包括\載體,線路二 機會斷言失敗:文件C:\ Program Files文件(x86)的\微軟 視覺studio 9.0 \ vc \ include \ vector98
謝謝。
矢量不是線程安全的,如果你嘗試從不同的線程同時那麼它將打破寫入。儘管你正在鎖定它,並且沒有其他代碼來查看你是如何使用它的,但是不可能知道可能發生了什麼問題。這個特殊的代碼本身看起來很好。 – Jarryd 2012-02-16 04:06:13
除了線程安全之外,您可能還需要考慮線程訪問向量的順序,如果一個線程正在讀取向量,那麼您應該確保另一個線程已經寫入向量或至少您的代碼應該處理矢量尚未寫入的條件。 – 2012-02-16 04:13:53
@Jarryd你是儀式,在這段代碼中,似乎他使用互斥鎖來鎖定向量,如果他這樣做,那麼它不應該引起問題,因爲我們需要去完成代碼的細節 – 2012-02-16 04:14:44