从本机句柄创建std ::线程

Create std::thread from native handle?

本文关键字:线程 std 创建 本机 句柄      更新时间:2023-10-16

如果我有一个std::thread对象t,我可以使用t.native_handle()来访问基础线程实现的API(例如Pthreads或Windows线程)。但是,如果我有基础线程实现的句柄(例如,pthreads线程)。有什么方法可以将其转换为C 11 std::thread

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

有什么方法可以做到吗?

使用GCC您可以从std::thread::native_handle_type构造std::thread::id,但您不能从中构造std::thread

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

std::thread设计为线程的 unique 手柄。不同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)。

理想情况下,平台将允许您在构造线程时指定参数,例如亲和力或堆叠,这将使您可以通过构造"非启示" thread对象来使用这些特定于平台的功能,而无需削弱类型系统。。但是至少GCC不支持这样做。