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

260*_*607 7 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) {} 
}
Run Code Online (Sandbox Code Playgroud)

当我关闭应用程序时,有时候,在调试中会有2条错误消息,有时候不会有错误消息.我经常听到人们谈论std :: vector不是线程安全的,这是其中一个案例吗?我正在使用Visual Studio 2008,提升线程,矢量的大小是固定的.任何人都可以提供一些关于如何在多线程应用程序中使用std :: vector的建议.

  1. ETP.exe中0x7688b9bc的第一次机会异常:Microsoft C++异常:std :: out_of_range在内存位置0x02d8f7bc ..
  2. ETP.exe中0x00e916e0处的第一次机会异常:0xC0000005:访问冲突读取位置0x00000008.
  3. 第二次机会断言失败:文件c:\ program files(x86)\ microsoft visual studio 9.0\vc\include\vector,Line Second Chance Assertion Failed:File c:\ program files(x86)\ microsoft visual studio 9.0\vc\include\vector98

谢谢.

Die*_*ühl 26

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

也就是说,std::vector<T>不是线程安全的声明,与其重复次数无关,是错误的.然而,似乎大多数人既不了解也不了解给出的线程安全保证.std::vector<T>在以下意义上是线程安全的:

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

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

  • 抱歉,但完全不同意你的观点,线程安全是一个已知的定义,它指出实现应该保证并发(线程)保护它的共享区域以避免冲突,这意味着一个类是否是线程安全的,说明它取决于关于用法意味着它不是线程安全的!,这怎么可能是正确的答案? (2认同)