multithreading - 线程是否立即启动
问题描述
我刚开始阅读 C++ Concurrency In Action 2012。在第 2 章中,它显示了一个正在调用和加入的线程。连接不是线程创建的原子操作。我的意思是线程开始于std:thread t(...)
并在随后的行join
中执行。我的假设是,当创建线程时,它可以随时开始执行,包括立即执行。如果它立即开始执行并在创建程序开始执行之前终止,则join
失败。
使用 if 时也会出现同样的问题t.joinable()
。
如果我的猜测是正确的,那么就不能保证 ajoin
可以成功并且joinable()
谓词也无济于事。我错过了什么?
解决方案
一个thread
对象可能代表一个执行线程,但这并不意味着实际的执行线程正在运行(即使它是在某个时间点)。
换句话说,当您构造一个thread
对象(代表一个实际的执行线程,即使用非默认构造函数)并且其关联的执行线程结束时,此事件不会改变对象的状态thread
。它仍然是joinable()
。
更准确地说,根据[thread.thread.class],非默认构造函数的后置条件是get_id() != id()
(即对象代表一个实际的执行线程)。改变该条件的唯一方法是join()
or detach()
(或移动它)——执行线程是否完成的事实不会改变get_id()
. 本标准说明阐明了唯一可以改变条件的事件:
[注:线程对象不代表在默认构造后、被移出或成功调用分离或加入后执行的线程。——尾注]
推荐阅读
- matplotlib - 通过显示补丁而不是线条来改进箱线图的 Matplotlib 图例
- swift - Core Image ciContext.writeHEIFRepresentation() 在使用 CICrop 过滤器时生成带有对角线的图像。我怎样才能防止这种情况?
- vue.js - 为什么我的 vue-tel-input 国家代码下拉列表在我的 vuejs 应用程序中格式不正确?
- odbc - 如何为 quickbooks 桌面构建我们自己的 odbc 驱动程序?
- redis - 是否有可能获得原始 RESP 响应流
- python - 唯一字符串的总和 - 熊猫
- uml - 多层架构序列图建议
- azure-cosmosdb - 我使用 Cosmos DB 并运行 SQL 命令并得到错误代码:SC1001
- reactjs - axios 不会从 django 服务器检索数据
- python - 通过迭代更改列表来填充数据结构——输出中仅存在最后一次更新