判断哪些线程已终止的有效方法
Effective Way to Tell Which Threads Have Terminated
我正在用C++编写一个服务器,它由一个接受传入请求的主线程组成,然后生成一个新的std::thread对象来处理响应它的任务。
这个 std::thread 对象进入线程列表,我想像这样定期清理这个列表:
For each thread in the list:
If the thread has finished executing:
Call join on the thread
Remove the thread object from the list
现在的挑战是如何确定这个线程(正在执行 void 函数)是否已经到达终点。joinable() 函数不起作用,因为它在执行过程中和之后都返回 true,并且我只希望我的主线程在完成后调用 join(),否则它将挂起并等待该子线程串行而不是并行执行。
好吧,您的架构选择是"每个请求的线程",那么您应该尊重有关副作用的一些核心事实。
- 线程
- 执行很便宜,线程创建不便宜。
- 同时存在的线程过多会白白浪费您的 RAM。
鉴于此,您不应该为"线程是否还活着"而烦恼。更好的是,您应该使用"线程池"习惯用语来缓解上述两种风险:
- 池
- 中的所有线程都是预先创建的,然后它们与池一样长,只是等待下一部分代码执行。
- 与电影院一样,线程池的空位数量有限,因此您始终可以预测线程需要多少资源。
因此,您想要的流程应该是:
For each thread in the list:
Wait for a new request to process
Get next request from the incoming queue
Process it
相关文章:
- 在C++中初始化向量映射的最有效方法
- 将此布尔值传递给此函数的最有效方法是什么?
- 比较C++变量的最有效方法
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- 确保套装新鲜度的有效方法
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 在C++事务之间存储大量字符数据的有效方法
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 一种将 Dart 中的字节数据转换为 C++ 中的无符号字符*的有效方法?
- 检查两个向量是否并行的最有效方法
- 从浮点数中删除小数部分但保留类型的有效方法
- 传递非泛型函数的最有效方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 创建字符串数组的有效方法
- 返回一个引用C++中另一个类对象的对象的有效方法
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 从std::map值中获取密钥的有效方法