2012-07-13 37 views
7

es de ninguna manera confiable en C++ 11 para detectar si el hilo actual es el hilo principal? O tendría que guardar manualmente los hilos del hilo principal id con std::this_thread::get_id() y luego tener una rutina de este tipo:std :: thread detect principal thread

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

¿Hay una manera común de hacer esto? ¿Funcionaría la solución anterior?

Gracias

+2

También podría establecer un indicador en el almacenamiento local de subprocesos, pero no estoy seguro de si TLS está ampliamente disponible en este momento. – dasblinkenlight

Respuesta

8

¿Qué quiere decir con main thread? Si quiere decir, el hilo que ejecuta main(), entonces no hay forma de que pueda saber si un hilo es un hilo principal o no. Debe guardar su ID y luego puede usar el ID guardado para saber si un hilo actual es un hilo principal o no, comparando su ID con el ID guardado (como lo adivinó en su pregunta).

Para explicarlo un poco más, los subprocesos no tienen jerarquía, no hay subproceso principal, no subproceso incluso si un subproceso crea los otros subprocesos. El sistema operativo no recuerda qué hilos creados por qué hilo. Por lo tanto, todos los hilos son los mismos para el sistema operativo y para su programa. Por lo tanto, no puede inferir un subproceso main, al detectar si el subproceso actual es el principal de todos los demás subprocesos en su aplicación.

+1

gracias por la explicación! De hecho menciono el hilo ejecutando main()! ¡Guardaré manualmente la identificación entonces! ¡Gracias! – moka

+3

Muy correcta respuesta. Como nota al margen y dependiendo de la plataforma, en las plataformas POSIX que ejecutan FreeBSD, OpenBSD, Mac OS X o iOS, hay una función en pthread.h - int pthread_main_np (void); Esto devuelve un valor distinto de cero si el hilo es el hilo principal. Si ha generado un hilo usando std :: thread, esta función subyacente funcionará correctamente. Tenga en cuenta que el "np" al final de la función significa "no portátil", por lo que todavía Nawaz tiene la mejor respuesta independiente de la plataforma. – NSDestr0yer