c++ - C ++多次声明相同的线程变量(在循环中)
问题描述
我想知道如果我这样做会发生什么:
void afunction(/*parameters*/) { /*do something*/ }
// And then in main...
while(1) {
thread aThread(afunction, /*parameters*/);
athread.detatch();
sleep(1);
}
这是否会创建无限数量的线程(直到系统崩溃)?或者它会在 1 秒后覆盖旧线程(比如杀死线程并创建一个新线程)?有什么问题我需要担心吗?
解决方案
前者。
特别是,当控制进入 while-loop-body 的范围时, thread
对象aThread
被创建,并且由它的构造函数产生一个新的 OS 线程(注意我在这里假设您正在使用std::thread
而不是其他一些线程类)。
然后调用detach()
线程对象,因此操作系统线程不再与aThread
对象关联,但它仍在运行。
然后在一秒延迟后,到达作用域的尽头,因此aThread
对象被销毁,但由于操作系统线程与aThread
对象分离,操作系统线程继续自行运行。
然后再次进入作用域以进行 while 循环的下一次迭代,整个过程无限期地重复。
一般来说,最好调用join()
你的线程而不是detach()
,因为这将允许你的程序进行有序的关闭。没有join()
,就很难或不可能安全地拆除进程范围的资源,因为您不能保证仍在运行的线程在拆除发生时可能不在使用这些资源。因此,大多数编写良好的多线程程序将join()
在 结束之前调用所有当前正在运行的线程,main()
如果不是更早的话。
推荐阅读
- haskell - Haskell:将任何 Ast 评估为字符串
- python - SSL:TLSV1_ALERT_PROTOCOL_VERSION tlsv1 警报协议版本 (_ssl.c:661) - 跳过 - Python
- excel - Excel 中的奇怪行为与可旋转
- python - 使用 pywinauto 时有一个窗格元素而不是窗口
- angular - 改变ngx--graph的链接颜色
- c++ - 编译器对“使用命名空间”指令做了什么?
- c# - 这个 Unity3D 代码的目的是什么?
- node.js - 如果另一个数组中不存在该值,则将其存储在数组中
- java - Huawei Account Kit 无法使用,如何实施?
- c - 将 aws iot 设备 sdk 作为用户 C 模块嵌入到 Micropython