从本机句柄创建std ::线程
Create std::thread from native handle?
如果我有一个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不支持这样做。
相关文章:
- 为什么std::async使用同一个线程运行函数
- 在std::thread中,joinable()然后join()线程安全吗
- 在main()之外初始化std::vector会导致性能下降(多线程)
- MESI协议和std::atomic-它是否确保所有写入立即对其他线程可见?
- 使用 std::string () const 函数启动线程或未来
- 用C++中的std::condition_variable将线程置于死锁中会有风险吗
- 即发即弃 std::线程对象清理自身
- std::mutex 如何防止线程修改?
- std::线程导致程序中止
- 如果在 2 个线程中使用,是否值得将size_t声明为 std::atomic?
- std::cout 来自多个线程
- 简单使用 std::atomic 在两个线程之间共享数据
- std::线程不是全局变量,但在到达创建它的函数的末尾时不会超出范围?
- 线程 std::调用未知类型,无法专门化函数错误
- 使用 std::chrono::steady_clock 对线程/异步中的代码进行基准测试
- 带有 std::cout 的多线程控制台文本动画
- 线程不是 std c++ 的成员
- ZeroMQ 在使用 std::thread 创建工作线程时崩溃
- 使用 std::condition_variable 触发其他线程.使用哪些互斥锁?
- 使用多线程(std::async、std::thread或?)加速