我的程序中有vector的问题。我发现了许多类似的问题但没有解决方案这段代码在新主题中:
while(status == RUN){
msleep(20);
while(status != DESTROY && (!actions.empty()) ){
item = actions.begin();
(*item)();
cout<< "try remove the action!\n";
item=actions.erase(actions.begin());
cout << "everything ok!\n";
}
}
输出是:
action!
try remove the action!
Segmentation fault
动作是向量&lt;作用&gt;
struct action{
string query;
long size;
void operator()(){
cout << "action!\n";
}
};
更新
真正的问题是:使用此方法的struct已经被破坏。
class mthread{
...
deque<action> actions;
...
operator(){
(loop above)
}
};
class mthread_holder{
mthread* mt;
operator()(){
(*mt)();
}
mthread_holder(mthread *p){
mt = p;
}
};
然后我只使用:
threads.back().thrd = new boost::thread(mthread_holder(mthrd));
我想,我需要更安全地存储它
如何在线程中存储callable并在不使用boost :: bind?
的情况下保存指向它的指针答案 0 :(得分:1)
猜测:你没有任何锁保护你的actions
队列,是吗?
当从多个线程访问相同的数据结构时,您需要使用锁或其他同步构造来防止同时访问,否则可能会导致奇怪的事情(崩溃或更糟)。
当你在这里时,你可能应该使用一个条件变量来避免每20毫秒唤醒一次,即使没有任何事情可做。并使用deque
作为队列,而不是vector
。