C++ 如果线程正在执行的函子被移动,会发生什么情况?

C++ 如果线程正在执行的函子被移动,会发生什么情况?,c++,stl,thread-safety,functor,C++,Stl,Thread Safety,Functor,假设我有一个类似于F的函子 struct F { // <some member variables go here> void operator()() { while(true) /*do stuff affecting the state*/; } }; 如果向量展开并将其内容复制到新位置,是否会导致线程中出现未定义的行为?或者它们只是崩溃 似乎他们的状态已经移动了,可能是在他们正在做的一些操作的中间。实际上,执行工作的对象会被复制然后删除,对吗?因为移动与线

假设我有一个类似于F的函子

struct F
{
    // <some member variables go here>
    void operator()() { while(true) /*do stuff affecting the state*/; }
};
如果向量展开并将其内容复制到新位置,是否会导致线程中出现未定义的行为?或者它们只是崩溃

似乎他们的状态已经移动了,可能是在他们正在做的一些操作的中间。实际上,执行工作的对象会被复制然后删除,对吗?因为移动与线程的执行是异步的,所以这似乎是个坏消息

我这样做是因为我希望能够保持对象的集合,每个对象都运行自己的线程。这些对象表示连接到系统的模块。我想能够添加和分离模块的飞行。如果在集合中存储对象不是一个好主意,那么还有什么替代方案?我必须在堆上分配它们并在集合中存储指针吗


如果这根本不是问题,您能解释一下原因吗?

boost::thread的构造函数通过值接受函子:

template <class F> explicit thread(F f);
模板显式线程(F);

这意味着它复制了您提供的函子,因此id不会引用函子向量中的对象。因此,应该没有影响。

boost::thread的构造函数通过值接受函子:

template <class F> explicit thread(F f);
模板显式线程(F);
这意味着它复制了您提供的函子,因此id不会引用函子向量中的对象。因此,应该没有影响。

在:

启动线程

通过传递一个可调用类型的对象来启动一个新线程 可以在没有参数的情况下调用构造函数。对象是 然后复制到内部存储器中,并在新创建的 执行线程。如果对象不能(或不能)复制, 然后可以使用boost::ref传递对函数的引用 对象在这种情况下,Boost.Thread的用户必须确保 引用的对象在新创建的执行线程之外

由于线程参数是复制的,因此在所有线程启动后移动向量不会有问题。

中:

启动线程

通过传递一个可调用类型的对象来启动一个新线程 可以在没有参数的情况下调用构造函数。对象是 然后复制到内部存储器中,并在新创建的 执行线程。如果对象不能(或不能)复制, 然后可以使用boost::ref传递对函数的引用 对象在这种情况下,Boost.Thread的用户必须确保 引用的对象在新创建的执行线程之外


由于线程参数是复制的,因此在所有线程启动后移动向量不会有问题。

根据,根本不需要存储函子。可调用对象将在构造时被复制,您提供的原始对象将不再被引用。

根据,您根本不需要存储函子。可调用对象将在构造时被复制,并且您提供的原始对象将不再被引用。

因此,如果我想在可调用对象执行期间与其交互,我需要使用boost::ref传递它。那么,在可调用对象执行期间存储该对象的安全方法是什么?如果我想使用集合,我必须在堆上分配它并存储指针吗?因此,如果我想在可调用对象执行期间与它交互,我需要使用boost::ref传递它。那么,在可调用对象执行期间存储它的安全方法是什么?如果要使用集合,是否必须在堆上分配它并存储指针?
functorVec.push_back(F());
template <class F> explicit thread(F f);