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

C++ 从本机句柄创建std::thread?,c++,c++11,C++,C++11,如果我有一个std::thread对象t,我可以使用t.native_handle()访问底层线程实现的API(例如pthreads或Windows线程)。但是如果我有一个来自底层线程实现的句柄(例如pthreads线程),该怎么办呢。有没有办法把它转换成C++11std::thread 这样做的动机是,可能需要使用本机平台线程API来设置具有特定关联或特定堆栈大小(或通过C++11 API无法访问的某些其他特征)的线程。然而,从那时起,坚持使用C++11功能将是一件好事 有什么方法可以做到这一

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

这样做的动机是,可能需要使用本机平台线程API来设置具有特定关联或特定堆栈大小(或通过C++11 API无法访问的某些其他特征)的线程。然而,从那时起,坚持使用C++11功能将是一件好事


有什么方法可以做到这一点吗?

使用GCC,您可以从
std::thread::native\u handle\u类型构建
std::thread::id
,但无法从中构建
std::thread

这意味着您可以测试给定的
pthread\u t
是否引用与
std::thread
对象相同的线程(或引用
This\u thread::get\u id()
),但无法从中创建新的
thread
对象

std::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,这将允许您使用这些平台特定的功能,而不会通过构建“非拥有的”
thread
对象削弱类型系统。。。但至少GCC不支持这样做