说我有一个仿函数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());
如果向量展开并将其内容复制到新位置,这是否会导致线程发生未定义的行为?还是它们会崩溃?
似乎他们的状态已经改变,可能是在他们对其执行某些操作的过程中。实际上,将工作对象复制然后删除,对吗?由于此举与线程的执行是异步的,因此似乎是个坏消息。
我问是因为我希望能够保留每个运行各自线程的对象的集合。这些对象代表连接到系统的模块。我希望能够动态添加和分离模块。如果将对象存储在集合中不是一个好主意,那有什么选择呢?我是否必须在堆上分配它们并将指针存储在集合中?
如果这根本不是问题,您能解释一下原因吗?
在参考中:
启动线程
通过将可以无参数调用的可调用类型的对象传递给构造函数来启动新线程。然后将该对象复制到内部存储中,并在新创建的执行线程上调用。如果不能(或不能)复制对象,则可以使用boost :: ref传递对函数对象的引用。在这种情况下,Boost.Thread的用户必须确保所引用的对象的寿命超过新创建的执行线程。
由于线程参数已复制,因此在启动所有线程之后移动向量将不是问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句