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

C++ 如何获取当前线程的std::thread?,c++,multithreading,c++11,C++,Multithreading,C++11,如何获取表示当前线程(已在运行的线程)的std::thread对象 我知道我可以做std::this\u thread::get\u id()。但是,这将给我一个std::thread:id对象 我的主要目标是允许其他线程加入当前线程。但是,问题是当前线程不是通过创建std::thread启动的,因此我无法事先保存它。您无法获得一个std::thread对象,该对象引用的线程不是由std::thread构造函数创建的。要么始终使用C++线程库,要么根本不使用它。例如,如果当前线程是由pthrea

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

我知道我可以做
std::this\u thread::get\u id()
。但是,这将给我一个
std::thread:id
对象


我的主要目标是允许其他线程加入当前线程。但是,问题是当前线程不是通过创建std::thread启动的,因此我无法事先保存它。

您无法获得一个
std::thread
对象,该对象引用的线程不是由
std::thread
构造函数创建的。要么始终使用C++线程库,要么根本不使用它。例如,如果当前线程是由
pthread\u create
创建的,则需要使用
pthread\u join

std::thread
将其连接到该线程。如果能够在没有从初始创建中获取资源的情况下任意获取线程,将破坏线程的工作方式


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

假设您的代码使用std::thread启动“其他线程”,该线程希望将()连接到“当前线程”

如果“当前线程”是主线程,即由main()启动的线程,那么出于充分的理由(例如,如果主线程退出,则整个进程退出),您不能将其设置为std::thread()实例。无论如何,您不应该让其他线程加入主线程

如果“当前线程”是从您自己的代码创建的,那么您应该将其更改为使用std::thread

如果“当前线程”是从第三方库创建的,那么您应该使用与第三方库公开的线程实现相同的线程实现。通常,如果第三方库希望您“join()”他们的线程,他们会向您公开join()方法,或者指示您应该使用特定的线程实现API(例如POSIX线程)来加入


不管是哪种方式,似乎有充分的理由,你不能做你想做的事

想象一下,您可以获得一个对自己的引用,您调用了
this\u thread().join()
…您可以在当前线程上执行的
std::thread
功能:您不能调用“join”在当前线程上,因为正如Kerrek指出的那样,您将自己加入。听起来OP希望将当前线程的
std::thread
对象的a引用传递给另一个线程,以便后者可以执行加入。这是一个。如果同一作者控制两个线程的源代码,那么
join()
并不是一个线程等待另一个线程完成其工作的唯一方式。想要当前线程的
std::thread
有什么不一致之处?@einpoklum查看。也就是说,死锁。@einpoklum不一致之处在于OP希望当前线程有一个
std::thread
对象,该对象未使用
std::thread
构造函数启动。如果他想为使用
std::thread
构造函数启动的当前线程使用
std::thread
对象,那么我的答案会有所不同(这不受支持,因为它违反了只有一个
std::thread
对象可以引用任何一个线程的规则)。