多线程 – 线程是否立即启动

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

如果使用t.joinable(),则会出现同样的问题.

如果我的猜测是正确的,则无法保证连接可以成功并且joinable()谓词没有帮助.我错过了什么?

最佳答案 线程对象可以表示执行的线程,但这并不意味着实际的执行线程正在运行(即使它是在某个时间点).

换句话说,当您构造线程对象(表示实际的执行线程,即您使用非默认构造函数)并且其关联的执行线程结束时,此事件不会更改线程对象的状态.它仍然是可加入的().

更准确地说,根据[thread.thread.class],非默认构造函数的后置条件是get_id()!= id()(即对象表示实际的执行线程).更改该条件的唯一方法是join()或detach()(或移动它) – 执行线程已完成或未完成的事实不会更改get_id()的返回值.该标准的说明澄清了可以改变条件的唯一事件:

[ Note: A thread object does not represent a thread of execution after default construction, after being moved from, or after a successful call to detach or join. — end note ]

点赞