我正在玩std::thread
我想知道如何获得新的线程IDstd::thread()
,我不是在谈论std::thread::id
而是给予线程的操作系统 ID(您可以使用pstree
)。
这仅供我所知,并且仅针对 Linux 平台(不需要可移植)。
我可以像这样获取线程中的 Linux 线程 ID:
#include <iostream>
#include <thread>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
void SayHello()
{
std::cout << "Hello ! my id is " << (long int)syscall(SYS_gettid) << std::endl;
}
int main (int argc, char *argv[])
{
std::thread t1(&SayHello);
t1.join();
return 0;
}
但是如何在主循环中检索相同的 id 呢?我没有找到使用的方法std::thread::native_handle
。我相信有可能渡过难关pid_t gettid(void);
由于 c++11 实现依赖于 pthreads,但我一定是错的。
有什么建议吗?
谢谢。
假设您正在使用 GCC 标准库,std::thread::native_handle()
返回pthread_t
返回的线程IDpthread_self()
,而不是返回的操作系统线程 IDgettid()
. std::thread::id()
是同样的包装pthread_t
和海湾合作委员会的std::thread
不提供任何获取操作系统线程 ID 的方法,但您可以创建自己的映射:
std::mutex m;
std::map<std::thread::id, pid_t> threads;
void add_tid_mapping()
{
std::lock_guard<std::mutex> l(m);
threads[std::this_thread::get_id()] = syscall(SYS_gettid);
}
void wrap(void (*f)())
{
add_tid_mapping();
f();
}
然后使用以下命令创建线程:
std::thread t1(&wrap, &SayHello);
然后通过以下方式获取 ID:
pid_t tid = 0;
while (tid == 0)
{
std::lock_guard<std::mutex> l(m);
if (threads.count(t1.get_id()))
tid = threads[t1.get_id()];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)