Proceso principal de C ++ esperando el problema del hilo secundario y su solución

0X00 C ++ 11 biblioteca <thread>

Hoy necesito usar multi-threading cuando hago experimentos, así que busqué algo de conocimiento que sea demasiado programación multi-thread en C ++.
Aprendí que en C ++ 11, se agregó una nueva biblioteca para admitir subprocesos múltiples:

#include <thread>

El método para crear un nuevo hilo es el siguiente:

std::thread t(function)

Cuál function()es función definida, function()el nombre de la función

Cuando se crea el hilo, hay dos formas de comenzar, una es .join(), la otra es.detach()

0X10. El problema de la función detach ()

Dijo que los dos métodos anteriores .join()son que el hilo comienza y se bloquea, es decir, si el hilo secundario no termina, entonces, el hilo principal o el proceso principal no continuará;
y .detach()eso es para abrir un hilo separado, el El hilo principal se separará, haciendo el suyo propio, no afectará al hilo principal.

Esto suena bien, pero aquí está el hoyo.
Si lo creó así, no crea que puede sentarse y relajarse

void function()
{
    
    
//...
}
int main()
{
    
    
//...
std::thread t(function);
t.detach();

return 0;
}

En este momento viene la pregunta, ¿crees que el programa principal te esperará?

Pero no, encontrará que su hilo no se ha estado ejecutando por mucho tiempo (asumiendo que es un hilo con un tiempo de ejecución largo), el programa principal sale.

En otras palabras, el programa principal no tiene que esperar. La razón es que el compilador estará returnoptimizado para exitque se vea obligado a retirarse del proceso, por supuesto, no es un proceso, el hilo se ha ido naturalmente.

0X20 solución-pthread_exit (NULL)

Entonces, ¿cómo podemos hacer esperar al hilo principal?

Muy simple, usa la siguiente función:

pthread_exit(NULL); 

Significa esperar a que terminen todos los hilos antes de finalizar el proceso principal

void function()
{
    
    
//...
}
int main()
{
    
    
//...
std::thread t(function);
t.detach();

pthread_exit(NULL); 
return 0;
}

El problema se resuelve simplemente

Aunque es muy simple, una vez que se comete un error, a veces es difícil de detectar. Entonces, si desea que el hilo principal espere a los hilos secundarios (que suele ser el caso), agregue: pthread_exit(NULL)¡correcto!

Muy bien, digamos esto hoy, nos vemos la próxima ~

Supongo que te gusta

Origin blog.csdn.net/rjszz1314/article/details/104724395
Recomendado
Clasificación