C++ 分割在 vector.erase() 上失败
Posted
技术标签:
【中文标题】C++ 分割在 vector.erase() 上失败【英文标题】:C++ segmentation fail on vector.erase() 【发布时间】:2011-03-31 05:01:35 【问题描述】:我的程序中的矢量有问题。我发现了许多类似的问题,但没有解决方案。此代码在新线程中:
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
actions 是一个向量
struct action
string query;
long size;
void operator()()
cout << "action!\n";
;
更新
真正的问题是:这个方法的结构体已经被销毁了。
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));
我想,我需要更安全地存放它
如何在没有 boost::bind 的情况下将可调用对象存储在线程中并保持指向它的指针?
【问题讨论】:
【参考方案1】:猜测一下:您没有任何锁来保护您的actions
队列,是吗?
当从多个线程访问同一个数据结构时,您需要使用锁或其他同步构造来防止同时访问,否则可能会导致奇怪的事情(崩溃或更糟)。
当您使用它时,您可能应该使用条件变量来避免每 20 毫秒唤醒一次,即使您无事可做。并为队列使用deque
,而不是vector
。
【讨论】:
我发现了真正的问题。在此循环开始之前销毁的线程对象。以上是关于C++ 分割在 vector.erase() 上失败的主要内容,如果未能解决你的问题,请参考以下文章
[转] C++ STL中map.erase(it++)用法原理解析