std::this_thread::get_id
是否与调用它的线程如何创建无关(无论是通过std::thread
、OpenMP、pthreads还是操作系统API)?
std::this_thread::get_id
是否与调用它的线程如何创建无关(无论是通过std::thread
、OpenMP、pthreads还是操作系统API)?
是的。
线程有标识符,无论是由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 不相等。
std::thread
和“执行线程”(不一定是std::thread
)。 - 463035818_is_not_a_numberstd::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