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

Kno*_*abe 5 c++ c++11

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

这样做的动机是可能需要使用本机平台线程API来设置具有例如特定关联或特定堆栈大小的线程(或者通过C++ 11 API无法访问的某些其他特性) ).但是,从那时起,坚持使用C++ 11功能会很不错.

有没有办法做到这一点?

Jon*_*ely 6

使用GCC,你可以构建一个std::thread::id来自a std::thread::native_handle_type但你不能从中构造一个std::thread.

这意味着您可以测试给定是否pthread_t引用与std::thread对象(或this_thread::get_id())相同的线程,但您无法从中创建新thread对象.

A 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();
Run Code Online (Sandbox Code Playgroud)

这样做的动机是可能需要使用本机平台线程API来设置具有例如特定关联或特定堆栈大小的线程(或者通过C++ 11 API无法访问的某些其他特性) ).

理想情况下,平台允许您在构造线程时指定诸如affinity或stacksize之类的参数,这将允许您使用这些特定于平台的功能,而不会通过构建"非拥有" thread对象来削弱类型系统...但至少海湾合作委员会不支持这样做.