Estas razones y cualquier otra significa que, si se mata un hilo, los recursos que podría haber adquirido no serían liberados para su uso por otros hilos y procesos. Cuando un hilo se completa naturalmente, se publica cualquier recurso adquirido.
El motivo típico para matar un hilo es que el usuario ya no necesita el resultado del hilo.
Hay algunas buenas noticias: C ++ 20 es la última versión de C ++ hoy. La clase de hilo de C ++ 20 tiene componentes para liberar los recursos, de un hilo, antes de su final natural y detenerlo antes de su final natural. De esta manera, C ++ está deteniendo el hilo y no mata el hilo. Dicho de otra manera, C ++ 20 está matando el hilo de manera responsable. La liberación de recursos y la detención del hilo son automáticas. Nota: No todos los hilos se pueden detener de esta manera. Tales hilos se completarían naturalmente, incluso si se intenta detenerlos.
La biblioteca de subprocesos tiene las siguientes clases para detenerse con la versión de recursos: stop_token, stop_source y stop_callback. Cada una de estas clases puede tener objetos instanciados desde. Sin embargo, solo se consideran stop_token y stop_source en este tutorial.
El comando para ejecutar un programa de hilos, con el compilador G ++, para C+20, debe ser similar a:
g ++ -std = C ++ 2a temperatura.CPP -LPTHREAD -O TEMP
Este tutorial explica cómo detener un hilo con recursos lanzados. Detener un hilo con recursos lanzados es una forma responsable de matar un hilo. Este tutorial comienza con un resumen de la codificación de un hilo.
Contenido del artículo
Resumen de codificación de hilos
Un programa en ejecución en C ++ es un proceso. Un hilo es un subproceso de un proceso. Un programa simple C ++ tiene solo un hilo, que es la función principal (). La función main () no es un hilo formalmente declarado. Cualquier otro hilo para el mismo programa debe declararse formalmente. Puede haber más de un hilo en un programa.
Un hilo se instancia desde una clase de hilo de la biblioteca de subprocesos. El primer argumento de la declaración de un objeto de hilo es el nombre de una función de nivel superior. La función de nivel superior es el hilo efectivo. Cuando el objeto está instanciado, la función de nivel superior comienza a ejecutar (ejecutar).
Hay un hilo de llamadas y un hilo llamado. Desafortunadamente, si el hilo llamado no se une desde el cuerpo de función del hilo llamado, el hilo de llamada puede completar su ejecución sin que el hilo llamado haya completado su propia ejecución. Esto significa problemas. Entonces, el cuerpo de función del hilo de llamada siempre debe unirse al hilo llamado después de la instancia del hilo llamado.
En el siguiente programa, se instancia un objeto de subproceso, utilizando la función de nivel superior, fn ()::
#incluir
#incluir
usando el espacio de nombres STD;
vacío fn ()
cout <<"first code segment of thread" <cout <<"second code segment of thread" <
int main ()
hilo thr (fn);
thr.unirse();
regresar 0;
La salida es:
primer segmento de código del hilo
Segmento de segundo código del hilo
Tenga en cuenta la inclusión de la biblioteca de subprocesos. Observe cómo se han codificado las primeras y segunda declaraciones de la función principal. La función principal () es el hilo principal. fn () es una función de nivel superior.
La clase JThread
El JThread es una clase definida en la biblioteca de subprocesos. Es como la clase de hilo, pero tiene la ventaja de que se puede usar para detener un hilo al liberar recursos. Tiene funciones de miembros para devolver un objeto stop_token y un objeto stop_source. Las funciones de los miembros son:
stop_source get_stop_source ()
stop_token get_stop_token ()
También tiene la función miembro para hacer una solicitud de parada, que es:
bool request_stop ()
A partir de ahora, en octubre de 2021, muchos compiladores de C ++ todavía están implementando la clase Jthread. Sin embargo, las muestras de código que se detallan a continuación deberían funcionar cuando su compilador ha implementado la clase JTHREAD.
Solicitar para detener un hilo
Detener el hilo significa evitar que la función de nivel superior se ejecute. Una solicitud para detenerse significa que el hilo debe detenerse lo antes posible. Si no se otorga la solicitud, el hilo se ejecutará hasta su finalización y no se detendrá antes de su finalización.
Como se indicó anteriormente, un hilo instanciado desde el JThread tiene las características para matar un hilo de manera responsable (evite que un hilo libere sus recursos). La función miembro para solicitar esta parada es:
bool request_stop ()
El valor de retorno es verdadero si la solicitud fue aceptada y falsa de lo contrario. Aceptar la solicitud no garantiza que el hilo se detendrá lo antes posible. Puede que no sea posible implementar la solicitud, y el hilo no se detendrá hasta que su final natural. Es decir, regresar verdadero no significa que la detención sea posible. El siguiente programa ilustra el uso de esta función miembro del objeto JThread:
#incluir
#incluir
usando el espacio de nombres STD;
vacío fn ()
cout <<"first code segment of thread" <cout <<"second code segment of thread" <
int main ()
JThread thr (fn);
thr.request_stop ();
thr.unirse();
regresar 0;
Este programa es similar al anterior, pero por dos puntos:
Es posible parar?
En algunas situaciones, no es posible detener un hilo. Sin embargo, el programador no puede saber si un hilo se puede detener o no. En este caso, el programador tiene que preguntar. El stop_source tiene la función miembro,
bool stop_Possible () const
Si el valor de retorno es verdadero, entonces es posible detener el hilo antes de su final natural. Si el valor de retorno es falso, es imposible detener el hilo antes de su final natural. JThread tiene un método que puede devolver el objeto stop_source.
Por lo tanto, puede ser mejor preguntar si se puede detener un hilo antes de detener el hilo. El siguiente programa ilustra esto:
#incluir
#incluir
usando el espacio de nombres STD;
vacío fn ()
cout <<"first code segment of thread" <cout <<"second code segment of thread" <
int main ()
JThread thr (fn);
stop_source ss = thr.get_stop_source ();
Si (SS.stop_Possible ())
thr.request_stop ();
demás
cout <<"Thread could be stopped!" <thr.unirse();
regresar 0;
El segmento del código de detención se ha colocado antes de la declaración de unión.
Se ha realizado la solicitud de parada?
Si es posible detener un hilo, eso todavía no garantiza que una instrucción request_stop () tenga éxito en detener el hilo antes de su final natural. Si el hilo no se ha detenido antes de su final natural como se esperaba, entonces el programador puede querer saber si se le había pedido al hilo que se detuviera con la instrucción request_stop ().
El objeto stop_token tiene la función miembro,
bool stop_requested ()
Esta función devuelve verdadero si se ha realizado una solicitud de parada y de lo contrario. El objeto JThread puede devolver un objeto stop_token, con su función miembro,
stop_token get_stop_token () const
El siguiente código de función Main () ilustra cómo saber si se ha emitido un request_stop:
int main ()
JThread thr (fn);
stop_source ss = thr.get_stop_source ();
Si (SS.stop_Possible ())
thr.request_stop ();
demás
cout <<"Thread could be stopped!" <stop_token st = thr.get_stop_token ();
if (st.stop_requested ())
cout <<"Still waiting for thrread to stop." <demás
thr.request_stop ();
thr.unirse();
regresar 0;
Todo el código de parada es antes de la declaración de unión. No confunda entre las funciones request_stop () y stop_requested ().
Conclusión
Un hilo puede ser matado de manera responsable con C ++ 20 y superior. Esto significa detener el hilo con los recursos del hilo, liberado. La biblioteca de subprocesos tiene clases Stop_Token, Stop_Source, Stop_Callback y JThread para matar un hilo de manera responsable. Para usar los objetos instanciados stop_token, stop_source y stop_callback, cree el hilo con la clase jthread. La clase JThread está en la biblioteca de subprocesos, que debe incluirse en el programa C ++.
La clase JThread tiene funciones de miembros para devolver los objetos stop_token y stop_source. La clase JThread en sí tiene la función miembro, request_stop (), para detener un hilo. Es probable que esta solicitud se otorgue, pero no hay garantía de que se otorgue. Si se otorga la solicitud, entonces el hilo se detiene lo antes posible, sin alcanzar su final natural, todo es igual.
El objeto stop_source se puede usar para saber si es posible detener un hilo. El objeto stop_token se puede usar para saber si se ha emitido un request_stop (). Una vez que se ha realizado una solicitud de parada, no se puede retirar (una solicitud de parada posterior no tiene ningún efecto).