C ++中“主”线程的ID

Posted

技术标签:

【中文标题】C ++中“主”线程的ID【英文标题】:id of "main" thread in c++ 【发布时间】:2012-11-08 11:14:49 【问题描述】:

c++中有没有办法获取“主”程序线程的id?

我看到std::this_thread::get_id() 获得了当前正在执行的线程的 id,但我需要 main 的 id,即原始程序线程。我没有看到任何功能可以得到这个。

原因是我有一些非线程安全的内部函数,它们只能在应用程序的原始线程上调用,所以为了安全起见,我想做:-

assert(std::this_thread::get_id() == std::main_thread::get_id());

但当然没有函数可以做到这一点,而且我看不到任何获取该信息的方法。

【问题讨论】:

好吧,我觉得很蠢,所有的cmets在启动时都只是在主线程中“保存它”。是的,我一直在寻找更复杂的东西,却错过了明显而微不足道的答案。谢谢大家。 想知道我是否应该删除这个问题,因为答案是如此微不足道,问它很尴尬。事情就这样完成了吗?还是我应该把它留作将来参考? 问题没问题,可能您无权访问main()。另一个观察结果是 std::main_thread (C++11) 可以替换为 boost::main_thread 【参考方案1】:

您可以在 this_thread 仍然是原始线程时保存它:

std::thread::id main_thread_id;

int main() 
    main_thread_id = std::this_thread::get_id(); // gotcha!
    /* go on */

【讨论】:

谢谢,是的,现在已经很明显了,我怎么错过了。觉得现在问很傻。 为什么不直接std::thread::id main_thread_id = std::this_thread::get_id(); 线程 ID 可以重复使用。无法保证任何特定线程都会喜欢应用程序。【参考方案2】:

这个话题似乎在这里讨论了很多次,就像在这个话题中一样:

Getting a handle to the process main thread

你可以找到一些解决方案,但我只是反过来想......当启动新线程时,只需将主线程的 id 提供给它们,并将其存储在其他线程的字段中。如果这在线程的整个生命周期中都不会改变,那么您就可以开始了,您可以通过这些句柄引用“主”线程。

【讨论】:

谢谢,现在完全明白了!

以上是关于C ++中“主”线程的ID的主要内容,如果未能解决你的问题,请参考以下文章

在C ++中是否可以从主线程中执行辅助线程中运行的函数?

C ++中OpenMP中的有序线程ID

C++11 thread::id 表示没有线程的特殊值

C++11多线程中的detach()join()joinable()

彻底搞懂多线程中各个难点

彻底搞懂多线程中各个难点