线程对象可以在 11 C++中移动是否合理?



在C++11中,可以移动线程对象。众所周知,我们创建的每个线程都拥有一个函子。显然,移动其函子尚未执行的线程是合理的。但是,移动正在调用或已经执行了一段时间的函子的线程呢?
更进一步,如果我实现一个线程包装器类,例如:

//noncopyable is a tag class of which copy constructor and copy assignment are deleted.
class Thread:noncopyable{
private:
using ThreadFunc = std::function<void()>;
bool started_;    //used to mark whether the functor executes or not
std::thread thread_;
CountDownLatch latch_;
std::string name_;
ThreadFunc func_;
...
public:
Thread(ThreadFunc func, const std::string& name)
:func_(std::move(func)),name_(name){}
...
}

我想像线程对象一样实现线程的移动操作。在移动操作之前检查started_会是更好的选择吗?(虽然我认为会是十比一不)喜欢:

Thread& Thread::operation=(Thread&& rhs) noexcept{
if(this != &rhs && !started_){
//do something
}
return *this;
}
Thread::Thread(Thread&& rhs) noexcept{
//do something
}

std::thread并不正式拥有构造它的函子。相反,函子由构造函数启动(在目标线程中)启动的std::invoke调用来持有。

因此,移动std::thread不需要也不会移动函子。只要线程在执行,函子就作为局部变量处于活动状态。

相关内容

  • 没有找到相关文章

最新更新