首页 > 解决方案 > 线程是否立即启动

问题描述

我刚开始阅读 C++ Concurrency In Action 2012。在第 2 章中,它显示了一个正在调用和加入的线程。连接不是线程创建的原子操作。我的意思是线程开始于std:thread t(...)并在随后的行join中执行。我的假设是,当创建线程时,它可以随时开始执行,包括立即执行。如果它立即开始执行并在创建程序开始执行之前终止,则join失败。

使用 if 时也会出现同样的问题t.joinable()

如果我的猜测是正确的,那么就不能保证 ajoin可以成功并且joinable()谓词也无济于事。我错过了什么?

标签: multithreadingc++11

解决方案


一个thread对象可能代表一个执行线程,但这并不意味着实际的执行线程正在运行(即使它是在某个时间点)。

换句话说,当您构造一个thread对象(代表一个实际的执行线程,即使用非默认构造函数)并且其关联的执行线程结束时,此事件不会改变对象的状态thread。它仍然是joinable()

更准确地说,根据[thread.thread.class],非默认构造函数的后置条件是get_id() != id()(即对象代表一个实际的执行线程)。改变该条件的唯一方法是join()or detach()(或移动它)——执行线程是否完成的事实不会改变get_id(). 本标准说明阐明了唯一可以改变条件的事件:

[注:线程对象不代表在默认构造后、被移出或成功调用分离或加入后执行的线程。——尾注]


推荐阅读