【问题标题】:Why does std::this_thread::get_id() function returns the same number in CentOS?为什么 std::this_thread::get_id() 函数在 CentOS 中返回相同的数字?
【发布时间】:2021-12-31 02:52:53
【问题描述】:

在以下代码中,.get_id() 调用在 CentOS 上运行时返回相同的值;但在 Windows 上,相同的代码返回不同的值。

为什么?

#include <unistd.h>
#include <iostream>
#include <thread>

void dosomework()
{
    std::cout << std::this_thread::get_id() << std::endl;
}

int main()
{
    for (int i = 0; i < 10; ++i){
        std::thread connectthread([](){
            dosomework();
        });
        std::cout << "connectthread:" << connectthread.get_id() << std::endl;
        connectthread.join(); 
        sleep(1000);
    }
    return 0;
}

【问题讨论】:

  • 由于每个线程都是在开始下一个线程之前加入的,最明显的解释是终止线程的id被简单地回收了。
  • 你的意思是dosomework函数打印的id和connectthread.get_id()部分不同吗?
  • @FantasticMrFox 好吧,在我的 Windows 系统中,这两个值对于每个线程都是相同的(应该如此)。只是它们从一个循环到下一个循环是不同的。

标签: c++ stdthread


【解决方案1】:

由于循环中的connectthread.join(); 调用,您创建的每个线程都会在另一个线程启动之前完成;因此,不会有两个线程同时运行。

进一步,as stated on cppreference(粗体/强调我的)1;注意get_id() 返回std::thread::id 类的对象:

这个类的实例也可以持有特殊的不同值 不代表任何线程。一旦线程完成,值 的 std::thread::id 可能被另一个线程重用。

“可能”一词的意思是由实现/平台决定是否将已完成线程的 ID 重新用于新线程。因此,Windows 和 CentOS 操作系统都符合您/他们创建的线程 ID 的要求。


1 C++ 标准说了很多相同的话,虽然更迟钝。来自this Draft C++17 Standard

33.3.2.1 类 thread::id       [thread.thread.id]


1thread::id 类型的对象为每个 执行线程和所有 thread 对象的单个不同值 不代表执行线程(33.3.2)。的每个线程 执行具有关联的 thread::id 对象,该对象不等于 thread::id 任何其他执行线程的对象,并且不是 等于任何线程对象的 thread::id 对象 表示执行线程。

【讨论】:

  • 请注意,如果您在join() 调用之后添加类似std::cout &lt;&lt; "dead thread:" &lt;&lt; connectthread.get_id() &lt;&lt; std::endl; 的行,您将(或应该)得到相同的结果( '特殊')每次的价值。在 Windows 上,这是 0 用于不代表正在运行的线程的线程对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
相关资源
最近更新 更多