我需要在类的构造函数中初始化一个 std::thread。线程应该运行类本身的成员函数。在 ctor 中尝试初始化线程时,程序会尝试运行成员函数。 (实现了移动语义)。
Page::Page(Motion *_parent):
parent(_parent)
{
std::thread x(&Page::play,this);
starter = std::move(x);
}
程序运行 this
的 play()
!
编辑:我这样做:
void Page::start()
{
std::thread x(&Page::play,this);
x.join();
}
并且工作正常但不知道它是否正常...现在我正在使用 std::bind
如果它是标准的方式,我将替换代码。
最佳答案
std::thread
的构造函数立即自动启动线程,然后新线程调用提供的函数,所以
std::thread x(&Page::play,this);
在新线程上自动调用 this->play()
。
这与某些线程库(例如 .Net)不同,在这些库中您必须通过调用 Start()
成员函数显式启动线程。 std::thread
没有“延迟启动”功能。
如果您不希望您的线程在调用其他函数之前真正启动,请不要在您的构造函数中初始化 std::thread
对象,而是在您的 中执行start()
函数,如您所示。
如果您在线程对象上调用 join()
,那么您的代码将在调用 join()
时等待线程完成。因此,如果您像示例 start()
函数那样在构造线程对象后立即放置连接,那么您最好直接调用 play()
,因为 start()
在线程完成之前不会返回。
您不需要 std::bind
和 std::thread
--- 线程构造函数自动处理绑定(bind)。
关于c++ - 在可移动类的构造函数中初始化 std::thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9272405/