我在多线程应用程序中使用 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,boost 线程,向量的大小是固定的。任何人都可以就如何在多线程应用程序中使用 std::vector 提供一些建议。
- ETP.exe 中 0x7688b9bc 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x02d8f7bc 处的 std::out_of_range ..
- ETP.exe 中 0x00e916e0 处的第一次机会异常:0xC0000005:访问冲突读取位置 0x00000008。
- 第二次机会断言失败:文件 c:\program files (x86)\microsoft visual studio 9.0\vc\include\vector,第二次机会断言失败:文件 c:\program files (x86)\microsoft visual studio 9.0\vc\include \矢量98
谢谢。
原文由 2607 发布,翻译遵循 CC BY-SA 4.0 许可协议
实际上,说明
X
是否是线程安全的 绝对 没有意义!你需要有资格使用什么样的用途。例如,当以某种方式在一个线程中使用并在另一个线程中销毁时,几乎没有任何类是“线程安全的”。也就是说,
std::vector<T>
不是线程安全的,与重复频率无关,这是 错误 的。然而,似乎大多数人既不理解也不欣赏所提供的线程安全保证。std::vector<T>
在以下意义上是线程安全的:这适用于向量结构本身。对包含对象的访问受约束于对其施加的任何规则。这些显然不是许多人想到的线程安全保证,但任何更强大的东西都不适用于容器接口。