如果我有一个std::thread
对象t
,我可以使用t.native_handle()
来访问底层线程实现的API(例如,pthreads或Windows线程)。但是,如果我有来自底层线程实现的句柄(例如,pthreads线程),该怎么办?有没有办法将其转换为C ++ 11 std::thread
?
这样做的动机是可能需要使用本机平台线程API来设置一个线程,例如,特定的亲和力或特定的堆栈大小(或某些其他无法通过C +访问的特性) +11 API)。但是,从那时起,坚持使用C ++ 11功能会很好。
有没有办法做到这一点?
答案 0 :(得分:6)
使用GCC,您可以从std::thread::id
构建std::thread::native_handle_type
,但无法从中构建std::thread
。
这意味着您可以测试给定的pthread_t
是否引用与std::thread
对象(或this_thread::get_id()
)相同的线程,但您无法创建新的thread
对象它
std::thread
旨在成为线程的唯一句柄。不同thread
对象获取底层线程所有权的唯一方法是将其从原始位置移出,因此只有一个对象立即“拥有”它。如果你可以用原生句柄构造它们,你可以这样做:
// start new thread
std::thread t(&thread_func);
// now have two handles to the same thread
std::thread t2( t.native_handle() );
std::thread t1.join();
// erm, hang on, this isn't right
std::thread t2.join();
这样做的动机是可能需要使用本机平台线程API来设置一个线程,例如,特定的亲和力或特定的堆栈大小(或某些其他无法通过C +访问的特性) +11 API)。
理想情况下,平台允许您在构造线程时指定affinity或stacksize等参数,这样您就可以使用这些特定于平台的功能,而不会通过构建“非拥有”{{1}来削弱类型系统。 }对象...但至少GCC不支持这样做。