Como você mata um tópico em c++?

Como você mata um tópico em c++?
Bem, você não deve matar um tópico em sua execução pelos seguintes motivos:
  • Um tópico pode ter aberto um arquivo para escrever e, se for morto, o arquivo não seria fechado. Isso é problema.
  • Um tópico pode ter adquirido uma trava nos recursos do computador para seu único uso. Se o tópico for morto, os recursos permanecerão bloqueados e outros threads e processos não poderão usar os recursos.
  • A memória alocada deve ser liberada. O tópico pode ter alocado alguma memória para algum propósito. Se o tópico for morto, a memória permanecerá falsamente alocada e indisponível para outros threads e processos. Isso é um vazamento de memória.

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
  • A classe JTHRead
  • Pedido para parar um tópico
  • É possível parar?
  • O pedido de parada foi feito?
  • Conclusão

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:

  • O tópico, Thr é instanciado da classe JTHRead.
  • A declaração (solicitação) para interromper o tópico o mais rápido possível é colocada antes da declaração de junção (). Nesse caso, o tópico de chamada é impedir que o fio chamado continue a executar.

É 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).