在以下代码中,.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)
由于connectthread.join();循环中的调用,您创建的每个线程都会在另一个线程启动之前完成;因此,不会有两个线程同时运行。
此外,如 cppreference (粗体/强调我的)1中所述;请注意,返回一个类的对象:get_id()std::thread::id
\n\n此类的实例还可以保存不代表任何线程的特殊独特值。一旦线程完成,std::thread::id 的值就可以被另一个线程重用。
\n
“可能”一词意味着由实现/平台决定是否将已完成线程的 ID 重新用于新线程。因此,Windows 和 CentOS 操作系统都符合您/它们创建的线程 ID 的要求。
\n1 C++ 标准也说了同样的事情,尽管更加晦涩难懂。从这个 C++17 标准草案中:
\n\n\n33.3.2.1 类线程::id \xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 [thread.thread.id]
\n\xe2\x80\xa6
\n
\n 1 \xc2\xa0\xc2\xa0\xc2\xa0\n类型的对象为每个执行线程\n提供唯一标识符,并为所有不代表某个对象的\n对象thread::id提供一个唯一的值thread执行线程 (33.3.2)。每个执行线程都有一个关联thread::id对象,该对象不等于thread::id任何其他执行线程的对象,也不等于thread::id不代表执行线程的任何线程对象的对象。
| 归档时间: |
|
| 查看次数: |
922 次 |
| 最近记录: |