在移动类的ctor中初始化std :: thread

时间:2012-02-14 05:58:48

标签: c++ multithreading c++11 std

我需要在类的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(); } 如果这是标准的做法,我会替换代码。

2 个答案:

答案 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;
}