std::this_thread::get_id是否与线程创建方式无关?

3

std::this_thread::get_id是否与调用它的线程如何创建无关(无论是通过std::thread、OpenMP、pthreads还是操作系统API)?

1个回答

3

是的。

线程有标识符,无论是由std::thread还是其他抽象表示。

这并不是证明,而是举例说明,您可以从cppreference中的std::this_thread::get_id示例中删除任何std::thread

#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>
 
std::mutex g_display_mutex;
 
void foo()
{
    std::thread::id this_id = std::this_thread::get_id();
 
    g_display_mutex.lock();
    std::cout << "thread " << this_id << " sleeping...\n";
    g_display_mutex.unlock();
 
    std::this_thread::sleep_for(std::chrono::seconds(1));
}
 
int main()
{
    foo();
}

查看它是否打印出主线程的id。

标准文档32.4.4#1如下:

返回:一个 thread​::​id 类型的对象,该对象唯一地标识执行当前线程。没有其他执行线程拥有此 id,而这个执行线程始终具有此 id。返回的对象与默认构造的 thread​::​id 不相等。


@Scheff 我添加了标准的相关部分。还请注意这个链接:http://eel.is/c++draft/thread#req.native-1。据我理解,它们明确区分了 std::thread 和“执行线程”(不一定是 std::thread)。 - 463035818_is_not_a_number
1
我从一个std::thread函数和一个使用CreateThread()启动的函数中打印了std::this_thread::get_id()的结果。我在VS2013和启用C++17的VS2017中都这样做了。在所有情况下,std::this_thread::get_id()的(打印)值看起来合理。我发现值得注意的是:sizeof(std::thread::id)在VS2013中返回16,在VS2017中返回4,而sizeof(std::thread::native_handle)在两种情况下都为8,就像我对x64的预期一样。我撤回了“std::this_thread::get_id()可能对于非std::thread不可靠”的说法。(我只是不知道。) - Scheff's Cat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接