std::vector,线程安全,多线程

新手上路,请多包涵

我在多线程应用程序中使用 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 提供一些建议。

  1. ETP.exe 中 0x7688b9bc 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x02d8f7bc 处的 std::out_of_range ..
  2. ETP.exe 中 0x00e916e0 处的第一次机会异常:0xC0000005:访问冲突读取位置 0x00000008。
  3. 第二次机会断言失败:文件 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 许可协议

阅读 1.6k
2 个回答

实际上,说明 X 是否是线程安全的 绝对 没有意义!你需要有资格使用什么样的用途。例如,当以某种方式在一个线程中使用并在另一个线程中销毁时,几乎没有任何类是“线程安全的”。

也就是说, std::vector<T> 不是线程安全的,与重复频率无关,这是 错误 的。然而,似乎大多数人既不理解也不欣赏所提供的线程安全保证。 std::vector<T> 在以下意义上是线程安全的:

  • 您可以同时从多个线程中读取一个向量对象。
  • 如果有一个线程更改向量对象,则不应有并发的读取器或写入器。
  • 对矢量对象的访问不会干扰其他矢量对象。

这适用于向量结构本身。对包含对象的访问受约束于对其施加的任何规则。这些显然不是许多人想到的线程安全保证,但任何更强大的东西都不适用于容器接口。

原文由 Dietmar Kühl 发布,翻译遵循 CC BY-SA 3.0 许可协议

你打电话 ptrVector->size() 没有先锁定它。这很容易成为您的问题的原因。确保在任何读取或写入之前锁定您的向量。

原文由 Clark Gaebel 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题