在构造函数上启动线程时调用不匹配
No match for call while launching thread on constructor
我有一个 class Foo
,它必须在构造函数上启动一个线程(这是我 class 上的一个方法 loop()
)。
我的class头文件是这样的:
class Foo
{
public:
Foo();
~Foo();
private
void loop();
std::thread m_thread;
//more stuff.
}
源文件是:
Foo::Foo()
{
m_thread(&Foo::loop, Foo()); // <---- No match for call '(std::thread) (void (Foo::*)(), Foo)'
m_thread.join();
}
Foo::~Foo()
{
m_thread.kill(); // <---- ??? how to do this?
}
void Foo::loop()
{
while()
{
//do stuff.
}
}
问题:
1 - 如何修复 Foo constructor
上的错误?编译时出现 "no match for call
" 错误。
加分题:
2 - 如何在对象的析构函数中终止线程?
1) 您正在尝试 调用 一个线程对象,而不是在此处对其进行初始化:
m_thread(&Foo::loop, Foo());
您应该设置并为其分配适当的值:
m_thread = std::thread(&Foo::loop, Foo());
但这将默认构造另一个 Foo
对象,它将启动一个线程,这将默认构造一个 Foo
对象,它将启动一个线程,它将...
所以,也许您的意思是在实例本身上启动线程,在这种情况下您需要
m_thread = std::thread(&Foo::loop, this);
注意通常在构造函数初始化列表中初始化数据成员比较好,但是由于线程调用了Foo
的成员,所以最好launch一旦对象被构造出来。
2)可以在析构函数中加入线程。只要确保没有异常传播出析构函数即可。
您还可以像这样在构造函数初始化列表中定义 m_thread 对象:
Foo::Foo() : m_thread(&Foo::loop, this), End(false)
{
m_thread.join();
}
结束线程的一个简单方法是使用成员变量 End,在构造函数中将其设置为 true 并在线程中循环
Foo::~Foo()
{
End = true;
m_thread.join(); // <---- ??? how to do this?
}
void Foo::loop(Foo* This)
{
while(This->End == false)
{
/*Do something*/
}
}
我有一个 class Foo
,它必须在构造函数上启动一个线程(这是我 class 上的一个方法 loop()
)。
我的class头文件是这样的:
class Foo
{
public:
Foo();
~Foo();
private
void loop();
std::thread m_thread;
//more stuff.
}
源文件是:
Foo::Foo()
{
m_thread(&Foo::loop, Foo()); // <---- No match for call '(std::thread) (void (Foo::*)(), Foo)'
m_thread.join();
}
Foo::~Foo()
{
m_thread.kill(); // <---- ??? how to do this?
}
void Foo::loop()
{
while()
{
//do stuff.
}
}
问题:
1 - 如何修复 Foo constructor
上的错误?编译时出现 "no match for call
" 错误。
加分题:
2 - 如何在对象的析构函数中终止线程?
1) 您正在尝试 调用 一个线程对象,而不是在此处对其进行初始化:
m_thread(&Foo::loop, Foo());
您应该设置并为其分配适当的值:
m_thread = std::thread(&Foo::loop, Foo());
但这将默认构造另一个 Foo
对象,它将启动一个线程,这将默认构造一个 Foo
对象,它将启动一个线程,它将...
所以,也许您的意思是在实例本身上启动线程,在这种情况下您需要
m_thread = std::thread(&Foo::loop, this);
注意通常在构造函数初始化列表中初始化数据成员比较好,但是由于线程调用了Foo
的成员,所以最好launch一旦对象被构造出来。
2)可以在析构函数中加入线程。只要确保没有异常传播出析构函数即可。
您还可以像这样在构造函数初始化列表中定义 m_thread 对象:
Foo::Foo() : m_thread(&Foo::loop, this), End(false)
{
m_thread.join();
}
结束线程的一个简单方法是使用成员变量 End,在构造函数中将其设置为 true 并在线程中循环
Foo::~Foo()
{
End = true;
m_thread.join(); // <---- ??? how to do this?
}
void Foo::loop(Foo* This)
{
while(This->End == false)
{
/*Do something*/
}
}