Essas razões e qualquer outro significa que, se um tópico for morto, os recursos que poderiam ter adquiridos não serão liberados para uso por outros threads e processos. Quando um tópico é concluído naturalmente, qualquer recurso adquirido é liberado.
O motivo típico para matar um tópico é que o usuário não precisa mais do resultado do tópico.
Há boas notícias: C ++ 20 é a versão mais recente do C ++ hoje. A classe de threads de C ++ 20 possui componentes para liberar os recursos, de um tópico, antes de sua extremidade natural e impedi -lo antes de seu fim natural. Dessa forma, C ++ está interrompendo o fio e não matando o tópico. Em outras palavras, o C ++ 20 está matando o fio de forma responsável. A liberação de recursos e a parada do tópico são automáticos. Nota: Nem todos os tópicos podem ser parados dessa maneira. Esses tópicos completariam naturalmente, mesmo que seja feita uma tentativa de detê -los.
A biblioteca de threads tem as seguintes classes para parar com a liberação de recursos: stop_token, stop_source e stop_callback. Cada uma dessas classes pode ter objetos instanciados de. No entanto, apenas stop_token e stop_source são considerados neste tutorial.
O comando para executar um programa de threads, com o compilador G ++, para C+20, deve ser semelhante a:
g ++ -std = c ++ 2a temp.cpp -lpthread -o temp
Este tutorial explica como parar um tópico com recursos lançados. Parar um tópico com recursos lançados é uma maneira responsável de matar um tópico. Este tutorial começa com um resumo de codificar um tópico.
Conteúdo do artigo
Resumo da codificação do thread
Um programa em execução no C ++ é um processo. Um tópico é um subprocesso de um processo. Um programa C ++ simples possui apenas um tópico, que é a função principal (). A função principal () não é um tópico formalmente declarado. Qualquer outro tópico para o mesmo programa deve ser formalmente declarado. Pode haver mais de um tópico em um programa.
Um tópico é instanciado de uma classe de threads da biblioteca de threads. O primeiro argumento da declaração de um objeto Thread é o nome de uma função de nível superior. A função de nível superior é o segmento eficaz. Quando o objeto é instanciado, a função de nível superior começa a executar (em execução).
Há um tópico de chamada e um tópico chamado. Infelizmente, se o encadeamento chamado não for unido a partir do corpo da função do encadeamento chamado, o encadeamento de chamada poderá concluir sua execução sem que o fio chamado tenha concluído sua própria execução. Isso significa problemas. Portanto, o corpo da função do encadeamento de chamada deve sempre se juntar ao Thread chamado após a instanciação do thread chamado.
No programa a seguir, um objeto de thread é instanciado, usando a função de nível superior, fn ():
#incluir
#incluir
usando namespace std;
void fn ()
cout <<"first code segment of thread" <cout <<"second code segment of thread" <
int main ()
Thread Thr (fn);
Thr.juntar();
retornar 0;
A saída é:
Primeiro segmento de código do thread
Segundo segmento de código do thread
Observe a inclusão da biblioteca de threads. Observe como a primeira e a segunda declarações da função principal foram codificadas. A função principal () é o tópico principal. fn () é uma função de nível superior.
A classe JTHRead
O Jthread é uma classe definida na biblioteca de threads. É como a classe Thread, mas tem a vantagem de que ela pode ser usada para parar um tópico, liberando recursos. Possui funções de membro para retornar um objeto Stop_token e um objeto Stop_source. As funções de membro são:
stop_source get_stop_source ()
stop_token get_stop_token ()
Ele também tem a função de membro para fazer uma solicitação de parada, que é:
bool request_stop ()
A partir de agora, em outubro de 2021, muitos compiladores de C ++ ainda estão implementando a classe JTHREAD. No entanto, as amostras de código fornecidas abaixo devem funcionar quando o seu compilador implementar a classe JTHREAD.
Pedido para parar um tópico
Parar o fio significa impedir que a função de nível superior execute. Um pedido para parar significa que o tópico deve parar o mais rápido possível. Se a solicitação não for concedida, o tópico será concluído e não parará antes de seu fim.
Conforme indicado acima, um tópico instanciado do JTHread tem os recursos para matar um fio de forma responsável (pare de liberar seus recursos). A função de membro para solicitar esta parada é:
bool request_stop ()
O valor de retorno é verdadeiro se a solicitação foi aceita e falsa caso contrário. Aceitar a solicitação não garante que o tópico pare o mais rápido possível. Pode não ser possível implementar a solicitação, e o tópico não parará até o seu fim natural. Isto é, retornar verdadeiro não significa que a parada seja possível. O programa a seguir ilustra o uso desta função de membro do objeto JTHRAD:
#incluir
#incluir
usando namespace std;
void fn ()
cout <<"first code segment of thread" <cout <<"second code segment of thread" <
int main ()
jthread thr (fn);
Thr.request_stop ();
Thr.juntar();
retornar 0;
Este programa é semelhante ao acima, mas para dois pontos:
É possível parar?
Em algumas situações, não é possível parar um tópico. No entanto, o programador não pode saber se um tópico pode ser parado ou não. Nesse caso, o programador tem que perguntar. O stop_source tem a função de membro,
bool stop_possible () const
Se o valor de retorno for verdadeiro, é possível parar o fio antes de seu fim natural. Se o valor de retorno for falso, é impossível parar o fio antes de seu fim natural. Jthread tem um método que pode retornar o objeto Stop_source.
Portanto, pode ser melhor perguntar se um tópico pode ser interrompido antes de parar o tópico. O programa a seguir ilustra o seguinte:
#incluir
#incluir
usando namespace std;
void 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 ();
if (ss.Stop_Possible ())
Thr.request_stop ();
outro
cout <<"Thread could be stopped!" <Thr.juntar();
retornar 0;
O segmento de código de parada foi colocado antes da declaração de junção.
O pedido de parada foi feito?
Se for possível parar um tópico, isso ainda não garante que uma instrução request_stop () conseguirá interromper o tópico antes de seu fim natural. Se o tópico não tiver parado antes de seu fim natural, como esperado, o programador pode querer saber se o tópico foi solicitado a parar com a instrução request_stop ().
O objeto Stop_token tem a função de membro,
bool stop_requested ()
Esta função retorna verdadeira se uma solicitação de parada foi feita e falsa caso contrário. O objeto Jthread pode retornar um objeto Stop_token, com sua função de membro,
stop_token get_stop_token () const
O código de função Main () a seguir ilustra como saber se um request_stop foi emitido:
int main ()
jthread thr (fn);
stop_source ss = thr.get_stop_source ();
if (ss.Stop_Possible ())
Thr.request_stop ();
outro
cout <<"Thread could be stopped!" <stop_token st = thr.get_stop_token ();
if (st.Parada solicitada())
cout <<"Still waiting for thrread to stop." <outro
Thr.request_stop ();
Thr.juntar();
retornar 0;
Todo o código de parada está antes da declaração de junção. Não confunda as funções request_stop () e stop_requested ().
Conclusão
Um tópico pode ser morto com responsabilidade com C ++ 20 e superior. Isso significa interromper o tópico com os recursos do tópico, libertado. A biblioteca de threads tem as classes Stop_Token, Stop_source, Stop_Callback e Jthread para matar um tópico com responsabilidade. Para usar os objetos instantados Stop_Token, Stop_source e Stop_Callback, crie o tópico com a classe JTHRead. A classe Jthread está na biblioteca de threads, que deve ser incluída no programa C ++.
A classe Jthread tem funções para devolver os objetos Stop_Token e Stop_source. A classe JTHread em si tem a função de membro, request_stop (), para parar um tópico. É provável que este pedido seja concedido, mas não há garantia de que será concedido. Se a solicitação for concedida, então o fio parar o mais rápido possível, sem atingir seu fim natural, tudo sendo igual.
O objeto Stop_source pode ser usado para saber se a interrupção de um tópico é possível. O objeto Stop_token pode ser usado para saber se um request_stop () foi emitido. Depois que uma solicitação de parada é feita, ele não pode ser retirado (uma solicitação de parada subsequente não tem efeito).