std::thread detect main thread

8

在C++11中,有没有可靠的方法来检测当前线程是否是主线程?还是我需要手动保存主线程的线程ID并编写像这样的例程:

bool isMainThread() {
    return std::this_thread::get_id() == mainThreadId;
}

bool isMainThread()
{
    return theMainThreadIdISavedOnProgramStart == std::this_thread::get_id();
}

有一个通用的方法来做这个吗?上面的解决方案可行吗?
谢谢。

2
你也可以在线程本地存储中设置一个标志,但我不确定TLS在这一点上是否广泛可用。 - Sergey Kalinichenko
1个回答

11
什么是主线程?如果你指的是执行 main() 的线程,那么你无法知道一个线程是否为主线程。你需要保存它的ID,然后通过将其ID与已保存的ID进行比较来确定当前线程是否为主线程(正如你在问题中猜测的那样)。
更进一步解释,线程没有等级制度,没有父线程、子线程之分,即使一个线程创建了其他线程也是如此。操作系统不会记住哪个线程由哪个线程创建。因此,所有线程对于操作系统和你的程序来说都是相同的。因此,你不能通过检测当前线程是否是应用程序中所有其他线程的父线程来推断出一个 main 线程。

1
谢谢解释!我确实是指执行main()的线程!我会手动保存ID的!谢谢! - moka
3
非常正确的答案。顺便提一下,根据平台不同,在运行FreeBSD、OpenBSD、Mac OS X或iOS的POSIX平台上,pthread.h中有一个函数int pthread_main_np(void);。如果线程是主线程,则返回非零值。如果您使用std::thread生成了一个线程,则此底层函数将正常工作。请注意,函数末尾的“np”表示“非便携式”,因此Nawaz仍然拥有最佳的平台无关答案。 - NSDestr0yer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接