为什么 std::this_thread::get_id() 函数在 CentOS 中返回相同的数字?

JY *_*Lee 5 c++ stdthread

在以下代码中,.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;
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*ica 3

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

\n

此外,如 cppreference (粗体/强调我的)1中所述;请注意,返回一个类的对象:get_id()std::thread::id

\n
\n

此类的实例还可以保存不代表任何线程的特殊独特值。一旦线程完成,std::thread::id 的值就可以被另一个线程重用。

\n
\n

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

\n
\n

1 C++ 标准也说了同样的事情,尽管更加晦涩难懂。从这个 C++17 标准草案中:

\n
\n

33.3.2.1 类线程::id \xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 [thread.thread.id]

\n

\xe2\x80\xa6
\n 1 \xc2\xa0\xc2\xa0\xc2\xa0\n类型的对象为每个执行线程\n提供唯一标识符,并为所有不代表某个对象的\n对象thread::id提供一个唯一的值thread执行线程 (33.3.2)。每个执行线程都有一个关联thread::id对象,该对象不等于thread::id任何其他执行线程的对象,也不等于thread::id不代表执行线程的任何线程对象的对象。

\n
\n