为啥将先前杀死的 boost 线程的线程 id 分配给新的 boost 线程?

Posted

技术标签:

【中文标题】为啥将先前杀死的 boost 线程的线程 id 分配给新的 boost 线程?【英文标题】:why thread id of previously killed boost thread is assigned to the new boost thread?为什么将先前杀死的 boost 线程的线程 id 分配给新的 boost 线程? 【发布时间】:2018-05-14 11:17:53 【问题描述】:

面临提升线程 Thread id 的问题 场景如下 Boost Thread A 是使用 threadid 假设 1234 生成的 Boost Thread B 是使用 threadid 生成的,假设为 7890 Boost 线程 C 生成,此时线程 A 已经完成了他的运行功能并结束,所以 boost 分配给线程 C 的线程 id 是 1234

从操作系统的角度来看,线程 id 应该是唯一的 为什么 boost 会将之前杀死的 boost 线程 id 分配给新线程?

我必须调试一些我需要唯一标识线程的问题 (对线程 id 的重用会导致混淆)

是他们将线程 id 显式分配给 boost 线程的一种方式 或 boost 线程的任何其他唯一标识

【问题讨论】:

当某物说它是“独特的”时,您必须准确定义它的含义。在这种情况下;唯一的线程 id 是当前未使用的;这并不意味着在操作系统运行时是唯一的;或在计算机的生命周期中独一无二;或独特的绝对。从这个独特的定义;一旦你加入线程;没有理由不能重复使用 id。 【参考方案1】:

Boost 不保证线程 ID 不会被重用。每the Boost documentation:

线程 ID

boost::thread::id 类的对象可用于识别线程。 每个正在运行的执行线程都有一个唯一的 ID,可从 通过调用get_id() 成员对应boost::thread 函数,或通过调用 boost::this_thread::get_id() 从 线。 boost::thread::id 类的对象可以被复制和使用 作为关联容器中的键:全方位比较 提供运算符。线程 ID 也可以写入输出 流使用流插入操作符,虽然输出格式 未指定。

boost::thread::id 的每个实例要么引用某个线程,要么 Not-a-Thread。引用 Not-a-Thread 的实例比较相等 彼此,但不等于任何引用实际的实例 执行线程。 boost::thread::id 上的比较运算符 为每个不相等的线程 ID 生成一个总订单。

请注意,线程 ID 保证仅在正在运行的个线程之间是唯一的。

您需要为您的线程对象创建自己的 id,并确保它在您的进程的生命周期内不能被重用。一个简单的同步 64 位单加计数器应该绰绰有余。即使每秒创建 1000 个线程,也可能需要 1000 亿年左右才能回到零。您的进程可能不会运行那么长时间。

【讨论】:

公平地说,如果线程没有被分离,线程ID被保证不会被重用。在这方面它有点像僵尸进程。 为了好玩:qalc "2^64 / 1000Hz to years" 显示 (2^64) / (1000 * hertz) = approx. 584.54205 megayears

以上是关于为啥将先前杀死的 boost 线程的线程 id 分配给新的 boost 线程?的主要内容,如果未能解决你的问题,请参考以下文章

Boost python /从线程导入模块需要ReleaseLock()。为啥?

使用 boost::asio::thread_pool 的 C++ 线程池,为啥我不能重用我的线程?

为啥 Boost 库在其线程屏障的实现中使用 m_ge​​neration 变量?

BOOST 线程:线程还是进程?

为啥我的客户端会杀死我的服务器?

boost::asio async_accept 杀死 ioservice