vector配合多线程的bug

来源:互联网 发布:linux echo 颜色 编辑:程序博客网 时间:2024/05/21 11:12

近日加利福尼亚大学同学来访问,写的程序core了,帮忙调试好半天。。纪录一下奇葩的bug。

起始bug的原因挺容易想到的,而且也是写代码的时候应该注意的地方。应为vector内存动态增长的原因,vector中的元素的指针和引用都是不可靠的。当然这一点在单线程时基本没有问题。但是多线程就跪了。

多线程传给线程函数一个vector中元素的指针,而主线程会改这个vector,导致线程函数需要用vector中元素时,这块内存已经不是vector的了,动态增长使得vector开了新空间,复制数据,释放旧空间。然后就报了错。。


下面是简化版的代码,原始代码很大,导致没能一眼看出来这个问题。

g++ -std=c++11 a.cpp -lpthread

#include <iostream>#include <vector>#include <thread>using namespace std;struct node {    virtual void f() const{        cout << "f()" << endl;    }    node(int a = -1): a(a) {        cout << "con" << endl;    }    node(const node &t): a(t.a){        cout << "copy con" << endl;    }    int a = 0;};void doSomething(node *n) {    n->f();}int main(int argc, char* argv[]) {    vector<node> x;    vector<thread> thrs;    for(int i = 0; i < 2; ++i) {        x.push_back(node());        thrs.push_back(thread(doSomething, &x[x.size()-1]));    }    for(thread &x: thrs) {        x.join();    }    return 0;}


0 0
原创粉丝点击