近日加利福尼亚大学同学来访问,写的程序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