Tôi đang sử dụng tiêu chuẩn :: vector dưới dạng dữ liệu được chia sẻ trong ứng dụng đa luồng. Tôi đóng gói thread bên trong một lớp học, ví dụ,std :: vector, chủ đề an toàn, đa luồng
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) {}
}
Khi tôi đóng ứng dụng, đôi khi , trong debug, sẽ có 2 thông báo lỗi, đôi khi sẽ không có thông báo lỗi. Tôi thường nghe mọi người nói về std :: vector không an toàn thread, đây có phải là một trong những trường hợp không? Tôi đang sử dụng Visual Studio 2008, thúc đẩy thread, kích thước của vector là cố định. Bất cứ ai cũng có thể cung cấp một số lời khuyên về cách sử dụng std :: vector trong một ứng dụng đa luồng.
- First-cơ hội ngoại lệ tại 0x7688b9bc trong ETP.exe: Microsoft C++ ngoại lệ: std :: out_of_range tại vị trí bộ nhớ 0x02d8f7bc ..
- First-cơ hội ngoại lệ tại 0x00e916e0 trong ETP.exe: 0xc0000005: Truy cập vị trí đọc vi phạm 0x00000008.
- Second Chance Assertion Failed: File c: \ program files (x86) \ visual studio microsoft 9.0 \ vc \ bao gồm vector \, dòng thứ hai Chance Assertion Failed: File c: \ program files (x86) \ microsoft thị giác studio 9.0 \ vc \ include \ vector98
Cảm ơn.
vectơ không an toàn, nếu bạn cố gắng viết cùng lúc với các chủ đề khác nhau thì nó sẽ bị hỏng. Bạn đang khóa nó mặc dù, và không có mã khác để xem cách bạn đang sử dụng nó, nó là không thể nói những gì có thể sẽ sai. Mã đặc biệt này của chính nó có vẻ ổn. – Jarryd
Ngoài chủ đề an toàn, có lẽ bạn cũng cần phải tính đến chuỗi trong đó các chủ đề của bạn truy cập vào vectơ, Nếu một luồng đang đọc từ vectơ thì bạn nên đảm bảo luồng khác đã ghi vào vectơ trước khi nó hoặc ít nhất mã phải xử lý điều kiện mà vectơ chưa được ghi vào. –
@ Jarryd bạn nghi thức, trong đoạn mã này có vẻ như anh ta đang khóa vectơ bằng cách sử dụng mutex, nếu anh ta làm như vậy, thì nó sẽ không gây ra vấn đề gì, để biết chi tiết chúng ta cần phải xem mã hoàn chỉnh –