我需要在类的ctor中初始化一个std :: thread。线程应该运行类本身的成员函数。在尝试初始化线程时,程序试图运行成员函数。 (移动语义已实现)。
Page::Page(Motion *_parent):
parent(_parent)
{
std::thread x(&Page::play,this);
starter = std::move(x);
}
程序运行play()
的{{1}}!
编辑:我这样做:
this
工作正常,但不知道是否可以......现在我正在玩void Page::start()
{
std::thread x(&Page::play,this);
x.join();
}
如果这是标准的做法,我会替换代码。
答案 0 :(得分:2)
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
---线程构造函数会自动处理绑定。
答案 1 :(得分:1)
这样的事情怎么样:
#include <iostream>
#include <thread>
#include <functional>
struct Foo
{
Foo()
: thread(std::bind(Foo::bar, this))
{ }
~Foo()
{ thread.join(); }
static void bar(Foo *foo)
{ }
std::thread thread;
};
int main()
{
Foo foo;
}