假设我有一个仿函数 F
struct F
{
// <some member variables go here>
void operator()() { while(true) /*do stuff affecting the state*/; }
};
如果我创建一个 Fs 向量
std::vector<F> functorVec(10);
然后用这些函子启动一堆线程
for (int i = 0; i < functorVec.size(); ++i)
{
boost::thread(functorVec[i]);
}
现在我对我的向量做了一些事情,比如
functorVec.push_back(F());
如果向量扩展并将其内容复制到新位置,这是否会导致线程中出现未定义的行为?还是他们会简单地崩溃?
似乎他们的状态发生了变化,可能是在他们正在对其进行的某些操作的中间。实际上,做这项工作的对象是被复制然后删除的,对吧?由于移动与线程的执行是异步的,所以这似乎是个坏消息。
我问是因为我希望能够保留一组对象,每个对象都运行自己的线程。这些对象表示附加到系统的模块。我希望能够即时添加和分离模块。如果将对象存储在集合中不是一个好主意,那么还有什么替代方法?我是否必须在堆上分配它们并将指针存储在我的集合中?
如果这根本不是问题,您能解释一下原因吗?