如何获取当前线程的std :: thread?

时间:2017-02-16 00:38:12

标签: c++ multithreading c++11

如何获得表示当前(已经运行的线程)的std::thread对象。

我知道我可以做std::this_thread::get_id()。但是,这会给我一个std::thread:id对象。

我的主要目标是允许其他一些线程加入当前线程。然而,问题是当前的一个并没有通过创建std :: thread来启动,所以我事先没有保存它。

3 个答案:

答案 0 :(得分:7)

您无法获取引用未由std::thread构造函数创建的线程的std::thread对象。要么始终使用C ++线程库,要么根本不使用它。例如,如果当前线程是由pthread_create创建的,则需要使用pthread_join加入它。

答案 1 :(得分:1)

std::thread无法复制。能够在不从初始创建中获取资源的情况下任意获取线程将破坏线程应该如何工作。

对线程的任何引用都应该或者已经从调用构造函数的对象移动。

答案 2 :(得分:1)

假设你的代码使用std :: thread来启动"其他线程",它想要加入()"当前线程"

如果"当前线程"是主线程,即由main()启动的线程,你不能使它成为一个std :: thread()实例,原因很简单(例如,如果主线程退出,整个进程退出)。你不应该有其他线程加入主线程。

如果"当前线程"是从您自己的代码创建的,然后您应该将其更改为使用std :: stread。

如果"当前线程"从第三方库创建,然后您应该使用与第三方库公开的相同的线程实现。通常,如果第三方图书馆希望您加入()"他们的线程,他们会向你公开一个join()方法,或者表明你应该使用特定的线程实现API(例如POSIX线程)来加入。

无论哪种方式,似乎有充分的理由,你不能做你想要的。