c++ - 在可移动类的构造函数中初始化 std::thread

标签 c++ multithreading c++11 std

我需要在类的构造函数中初始化一个 std::thread。线程应该运行类本身的成员函数。在 ctor 中尝试初始化线程时,程序会尝试运行成员函数。 (实现了移动语义)。

Page::Page(Motion *_parent):
    parent(_parent)
{
    std::thread x(&Page::play,this);
    starter = std::move(x);
}

程序运行 thisplay() !

编辑:我这样做:

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::bindstd::thread --- 线程构造函数自动处理绑定(bind)。

关于c++ - 在可移动类的构造函数中初始化 std::thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9272405/

相关文章:

c++ - 为什么不能在 switch 语句中声明变量?

c++ - 表达式不是积分常量 clang libc++ threading

c++ - 我怎样才能得到更好的分析?

java - 为什么我的线程不起作用?

c# - C# 中的线程问题(字段初始化程序无法引用非静态字段等)

C++ Mutexes-检查是否有另一个线程在等待

std::vector 的 C++ 钳位函数

c++ - 如果 compile-time-constant 参数错误,则生成编译时错误

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - 发生了什么事:C++ std::move on std::shared_ptr 增加了 use_count?