C Vector,push_back从另一个线程崩溃?

我使用经过检查的STL实现在我的代码中有意外的断言故障.

经过一些研究后,我将问题缩小到一个向量中的push_back,该向量来自与创建向量的线程不同的线程.

重现此问题的最简单代码是:

class SomeClass
    {
    private:
        std::vector<int> theVector;
    public:
        SomeClass () 
        {
            theVector.push_back(1); // Ok
        }


        void add()
     {
          theVector.push_back(1); // Crash 
     }
};

唯一的区别是SomeClass是从我的主线程实现的,而add是从另一个线程调用的.然而,没有一个简洁的问题:在我用于排除故障的最简单的代码形式中,除了我上面提到的情况之外,没有人从这个向量中读取或写入.

跟踪push_back代码,我注意到std :: vector中的一些方法如count()或size()返回垃圾,当从另一个thred(方法“add”)调用时,从创建线程调用时返回正确的值(例如在构造函数中)

我应该得出结论,std :: vector在多线程环境中不可用吗?或者是否有解决此问题的方法

编辑:删除volatile

编辑2:你认为这个问题可能不在于多线程吗?在我的测试运行中,add只被调用一次(使用断点验证).如果我从构造函数删除push_back,我仍然会崩溃.所以最后,即使只调用一个向量的方法,在一次调用函数中也会使断言失败.因此,不能有可靠性,或……?

解决方法

如果你可以保证在调用push_back时没有人写入或读取向量,那么就没有理由它会失败.您可能正在处理更高级别的内存损坏.您应该验证“this”指向SomeClass的真实实例,检查其他成员等.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...