Din*_*aiz 6 c++ multithreading stl vector thread-safety
我使用经过检查的STL实现在我的代码中有意外的断言故障.
经过一些研究后,我将问题缩小到一个向量中的push_back,该向量来自与创建向量的线程不同的线程.
重现此问题的最简单代码是:
class SomeClass
{
private:
std::vector<int> theVector;
public:
SomeClass ()
{
theVector.push_back(1); // Ok
}
void add()
{
theVector.push_back(1); // Crash
}
};
Run Code Online (Sandbox Code Playgroud)
唯一的区别是SomeClass是从我的主线程实现的,而add是从另一个线程调用的.然而,没有一个简洁的问题:在我用于排除故障的最简单的代码形式中,除了我上面提到的情况之外,没有人从这个向量中读取或写入.
跟踪push_back代码,我注意到std :: vector中的一些方法如count()或size()返回垃圾,当从另一个thred(方法"add")调用时,从创建线程调用时返回正确的值(例如在构造函数中)
我应该得出结论,std :: vector在多线程环境中不可用吗?或者是否有解决此问题的方法?
编辑:删除volatile
编辑2:你认为这个问题可能不在于多线程吗?在我的测试运行中,add只被调用一次(使用断点验证).如果我从构造函数中删除push_back,我仍然会崩溃.所以最后,即使只调用一个向量的方法,在一次调用的函数中也会使断言失败.因此,不能有可靠性,或......?
std::vector绝对可以在多线程环境中使用,前提是您不能同时从两个线程访问向量.我一直都没有遇到麻烦.
既然vector不是问题,您需要更仔细地查看同步机制,因为这很可能是问题所在.
我注意到你标记vector为volatile.你期望它能volatile提供同步吗?因为它不会. 在这里看到更多的信息.
编辑:原来提供了错误的链接.这已经修复了.抱歉混淆.
如果您可以保证在调用 push_back 时没有人在向向量写入或读取数据,那么它就没有理由失败。您可能正在处理更高级别的内存损坏。您应该验证“this”是否指向 SomeClass 的真实实例,检查它的其他成员等。
| 归档时间: |
|
| 查看次数: |
12627 次 |
| 最近记录: |