2012-07-13 59 views
7

是任何可释放的方式在c + + 11检测是否当前线程是主线程?或者,我必须手动保存主线程的线程ID与std::this_thread::get_id(),然后有一个这样的程序:std ::线程检测主线程

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

有没有做到这一点的常用方法?上述解决方案是否有效?

谢谢

+2

您也可以在线程本地存储中设置一个标志,但我不确定此时TLS是否广泛可用。 – dasblinkenlight 2012-07-13 11:21:51

回答

8

你是什么意思的主线程?如果你的意思是执行main()的线程,那么你就不可能知道线程是否是主线程。您必须保存其ID,之后您可以使用已保存的 ID通过比较其ID与保存的ID(正如您在问题中猜测的那样)来确定当前线程是否为主线程。

要多说明一点,线程没有层次结构,没有父线程,即使一个线程创建其他线程也没有子线程。操作系统不记得哪个线程创建了哪些线程。因此,所有线程都与操作系统和您的程序相同。因此,通过检测当前线程是否是应用程序中所有其他线程的父代,您无法推断出main线程。

+1

感谢您的解释!我真的认为执行main()的线程!那么我将手动保存该ID!谢谢! – moka 2012-07-13 11:50:45

+3

非常正确的答案。作为一个旁注和取决于平台,在运行FreeBSD,OpenBSD,Mac OS X或iOS的POSIX平台上,pthread.h中有一个函数 - int pthread_main_np(void);如果线程是主线程,则返回非零值。如果你使用std :: thread产生了一个线程,这个底层函数将正常工作。注意函数末尾的“np”意味着“不可移植”,所以Nawaz仍然有最好的平台无关答案。 – NSDestr0yer 2014-05-20 23:13:39