从本机句柄创建std :: thread?

时间:2012-11-13 00:05:17

标签: c++ c++11

如果我有一个std::thread对象t,我可以使用t.native_handle()来访问底层线程实现的API(例如,pthreads或Windows线程)。但是,如果我有来自底层线程实现的句柄(例如,pthreads线程),该怎么办?有没有办法将其转换为C ++ 11 std::thread

这样做的动机是可能需要使用本机平台线程API来设置一个线程,例如,特定的亲和力或特定的堆栈大小(或某些其他无法通过C +访问的特性) +11 API)。但是,从那时起,坚持使用C ++ 11功能会很好。

有没有办法做到这一点?

1 个答案:

答案 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不支持这样做。