5

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

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

有没有办法做到这一点?

4

1 回答 1

6

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

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

Astd::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 访问的特性)的线程)。

理想情况下,平台将允许您在构造线程时指定参数,例如亲和力或堆栈大小,这将允许您使用这些特定于平台的功能,而不会通过构造“非拥有”thread对象来削弱类型系统......但至少GCC 不支持这样做。

于 2012-11-13T00:31:02.277 回答