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

时间:2012-02-16 03:55:49

标签: c++ multithreading

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

  1. ETP.exe中0x7688b9bc的第一次机会异常:Microsoft C ++ 异常:内存位置为0x02d8f7bc的std :: out_of_range ..
  2. ETP.exe中0x00e916e0的第一次机会异常:0xC0000005:Access 违规阅读地点0x00000008。
  3. 第二次机会断言失败:文件c:\ program files (x86)\ microsoft visual studio 9.0 \ vc \ include \ vector,Line Second 机会断言失败:文件c:\ program files(x86)\ microsoft visual studio 9.0 \ vc \ include \ vector98
  4. 感谢。

3 个答案:

答案 0 :(得分:24)

实际上,状态X绝对无意义是否是线程安全的!您需要有资格获得什么样的用途。例如,当它以某种方式在一个线程中使用并在另一个线程中被破坏时,几乎没有任何类将是“线程安全的”。

尽管如此,std::vector<T>不是线程安全的,与其重复次数无关的陈述是错误。然而,似乎大多数人既不了解也不了解给出的线程安全保证。 std::vector<T>在以下意义上是线程安全的:

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

这适用于矢量结构本身。对包含对象的访问受限于对它们施加的任何规则。这些显然不是许多人想到的线程安全保证,但更强大的东西不适用于容器界面。

答案 1 :(得分:4)

您先调用ptrVector->size()而不先将其锁定。这可能很容易成为您的问题的原因。确保在任何读取或写入之前锁定向量。

答案 2 :(得分:0)

也许你可以改用它?

来自英特尔线程构建模块的

concurrent_vector ...

https://software.intel.com/en-us/node/467758