我在多线程应用程序中使用std :: vector作为共享数据。我将线程封装在一个类中,例如
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,提升线程,矢量的大小是固定的。任何人都可以提供一些关于如何在多线程应用程序中使用std :: vector的建议。
感谢。
答案 0 :(得分:24)
实际上,状态X
是绝对无意义是否是线程安全的!您需要有资格获得什么样的用途。例如,当它以某种方式在一个线程中使用并在另一个线程中被破坏时,几乎没有任何类将是“线程安全的”。
尽管如此,std::vector<T>
不是线程安全的,与其重复次数无关的陈述是错误。然而,似乎大多数人既不了解也不了解给出的线程安全保证。 std::vector<T>
在以下意义上是线程安全的:
这适用于矢量结构本身。对包含对象的访问受限于对它们施加的任何规则。这些显然不是许多人想到的线程安全保证,但更强大的东西不适用于容器界面。
答案 1 :(得分:4)
您先调用ptrVector->size()
而不先将其锁定。这可能很容易成为您的问题的原因。确保在任何读取或写入之前锁定向量。
答案 2 :(得分:0)