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

Posted

技术标签:

【中文标题】如何获取当前线程的 std::thread?【英文标题】:How to get std::thread of current thread? 【发布时间】:2017-02-16 00:38:12 【问题描述】:

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

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

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

【问题讨论】:

想象一下你可以得到一个对你自己的引用,然后你打电话给this_thread().join()... std::thread 的功能可以在当前线程上执行:cplusplus.com/reference/thread/this_thread 您不能在当前线程上调用“join”,因为正如 Kerrek 指出的那样,您将自己加入。 听起来 OP 想要将当前线程的 std::thread 对象的引用传递给另一个线程,以便后者可以执行连接。 这是XY problem。如果同一作者控制两个线程的源代码,那么join() 并不是一个线程可以等待另一个线程完成其工作的唯一方式。 【参考方案1】:

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

【讨论】:

想要当前线程的std::thread 有什么不一致的地方? @einpoklum 看看this comment。也就是说,一个死锁 @einpoklum 不一致之处在于 OP 想要一个 std::thread 对象用于当前线程 不是使用 std::thread 构造函数启动的。如果他想要一个std::thread 对象用于 使用std::thread 构造函数开始的当前线程,那么我的答案会有所不同(不支持,因为它违反了只有一个@987654331 的规则@object 可以引用任何一个线程)。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

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

不管怎样,似乎有充分的理由,你不能做你想做的事。

【讨论】:

以上是关于如何获取当前线程的 std::thread?的主要内容,如果未能解决你的问题,请参考以下文章

OpenMP、MPI、POSIX 线程、std::thread、boost::thread 如何关联?

如何销毁由 std::thread 显式创建的线程?

如何使用 QThread 创建一个分离的线程,就像在 std::thread 中一样

在运行之前获取 std::thread 的 thread:id?

如何放弃或取消 std::thread

如何使用 std::thread C++ 生成多个调用相同函数的线程 [关闭]