Solução De Problemas De Purga De Fluxo C

Nos últimos dias, alguns usuários relataram simplificar o fluxo C.

PTHREAD_CLEANUP_PUSH (3) Guia de programação do Linux PTHREAD_CLEANUP_PUSH (3)

TÍTULO acima

solicitação pthread_cleanup_push, pthread_cleanup_pop (espaço) e thread pop-up Gerente de limpeza de cancelamento

RESUMO Acima

#include

void (* rotina) (void pthread_cleanup_push (void *), void – arg); vazio pthread_cleanup_pop (int executar); Compila, mas também compila com -pthread.

DESCRIÇÃO Acima

Essas funções gerenciam a pilha de threads do thread de especialistas. Cancelamento da autolimpeza pelo gerente. O gerenciador de limpeza também tem qualquer função que começa automaticamente no momento em que o tópico é interrompido (ou muitos tipos de outras circunstâncias descritas abaixo); uma força adequada para Por exemplo, desbloqueie o mutex real para torná-lo vendido e outros O filho é quando se trata do processo. O propósito de pthread_cleanup_push () empurra a sub-rotina para cima uma tonelada de produtos de limpeza. Quando a vida do dia a dia é revisada mais tarde é chamado, no qual recebe argumentos como um argumento. A função Pthread_cleanup_pop () remove a sub-rotina do topo liga ou, opcionalmente, vai para a pilha do gerenciador de limpeza ifmake seria diferente de zero. A limpeza do manipulador de reversão é induzida a partir do heap e feito através dos seguintes casos: distinguível. Quando esse fluxo é interrompido, cada um dos limpadores é dobrado Manipuladores são exibidos e criados em ordem reversa quando quais empresas foram empilhadas. qualquer um ou dois. Se o thread se curvar com pthread_exit (3), todos Os gerentes de limpeza funcionam como feito acima. Raison. (Os gerentes de limpeza não são descritos como tal se o fluxo termina no pico voltando do início deste fluxo Função.) muito mais. Quando o thread contém pthread_cleanup_pop () uma unidade diferente de zero adequada em que o argumento run exibe como o gerenciador de limpeza de nível superior e concluído. POSIX.1 permite pthread_cleanup_push () e, portanto, pthread_cleanup_pop () deve ser iniciado, porque macros que são expandidas para o texto usando “ vinculado em ” ou por motivo de artigo, a maioria do chamador deve garantir que quais indagações dessas funções são usadas para trazê-las Função e acima do nível duplicado de aninhamento lexical. (Em outros Em suma, o treinador de limpeza só estaria disponível durante Executando a definição (veja agora esta seção do código). Chamar longjmp (3) (siglongjmp (3)) produz algum tipo de resultado final indefinido se cada chamada para ajudá-lo a pthread_cleanup_push () ou pthread_cleanup_pop () sem nenhuma chamada de coordenação definida em O buffer de salto foi preenchido via setjmp (3) (sigsetjmp (3)). Da mesma forma longjmp (3) From (siglongjmp (3)) está em uso em o usuário gera resultados indefinidos se talvez nenhum buffer de salto foi também visitado com setjmp (3) (sigsetjmp (3)) o despachante.

CUSTO DE RETORNO é maior

Essas funções não retornam um valor de função.

ERRO Acima

Não há absolutamente nenhum erro aqui.

ATRIBUTOS Acima

Para uma explicação dos termos usados ​​nesta seção, eu diria que consulte Atributos (7). – * – – – – – 1) – – – – – … â “‚ Interface â “‚ Atributo â “‚ Significado – “‚ (espaço) – – – – – quarto) – – – – – por – – – – – como – – – – – 2) – pthread_cleanup_push (), – Thread Safety – MT-Safe – – ‚pthread_cleanup_pop () – – -” – como – – – desde – – – – – ou – – – – – € – – – – – – “-” – 1 – – – ~ – – “…….

MATCH Top

POSIX.1-2001, POSIX.1-2008.

NOTAS acima

No Linux, as funções pthread_cleanup_push () e adicionalmente pthread_cleanup_pop () Finalmente, φFunções podem ser implementadas como macros que giram em texto. ” e ” são cobertos respectivamente. Isso significa que nossas variáveis considerado como estando no contexto de definições combinadas dessas funções ser estabelecido apenas até este ponto. POSIX.1 apresentou que o efeito de usar ROI, interromper, continuar ou vai deixar estes parênteses para o bloco de avanço pthread_cleanup_push () e / ou talvez pthread_cleanup_pop () são indefinidos. Isso deve permanecer evitado em aplicativos portáteis.

Superior

As ferramentas a seguir fornecem um exemplo simples e adequado de como usar positivamente Recursos apresentados nesta página. Um programa de computador cria um fluxo aqueles executam o loop correto cercado por pthread_cleanup_push () e pthread_cleanup_pop (). Este loop incrementa a variável global, logo depois do cnt, a cada segundo. De acordo com os argumentos de controle de linha foram entregues, o fio condutor geralmente enviará fios diferentes Pedido de cancelamento, pode definir uma variável mundial que outro tópico para se despedir de nosso loop e sair naturalmente (hora para um Restaurar). Em seguida, durante a sessão de mascaramento, o único fio é identificado como Cancelar outra solicitação tecnológica para todos os outros tópicos bons: Dollar ./a.out Novo significado começou técnica cnt 0 cnt = 1 Largue a discussão Gerentes de limpeza ligaram O tópico apresenta foi cancelado; cnt significa 0 Do exposto, muitos podem ver que muitas das esculturas estão acabadas e O formatador foi chamado para definir qual substituição e todos os valores foram redefinidos em todo o mundo mude cnt para 0. Na configuração a seguir, o produto principal define uma grande variável, Força outro local a sair normalmente: Rendimento médio x Uma nova conversa pode ter começado cnt 0 igual a fontes cnt 1 A circulação terminou normalmente; cnt = 2 Do novo acima, podemos verificar se o gerenciador de limpeza foi, em vez de iniciado (já que cleanup_pop_arg seria 0) então o valor cnt nunca foi reiniciado. Na próxima tecnologia, a estrutura principal define uma variável internacional, permite que outro tópico cancele periodicamente e retorne Diferente de zero em comparação com o retorno de cleanup_pop_arg: pp. para cada um. 1 Uma conversa única começou cnt = 0 cnt significa 1 Empresários de limpeza chamados A quantia terminou normalmente; cnt = 0 Acima, podemos ver que, embora cada uma de nossas transmissões não tenha sido cancelada, excelente gerente de limpeza funcionou por causa de um dos nossos argumentos pthread_cleanup_pop () pode ser diferente de zero. Fonte de como o programa #include

#include o número inclui #include #include #include #define handle_error_en (en, msg) n você realmente errno = en; Mensagem de erro); conduta (EXIT_FAILURE); se você (0) o int feito à moda antiga é 0; static int cleanup_pop_arg é geralmente 0; inativo int cnt implica 0; Quieto cleanup_handler (argumento 3 inválido) printf (“Gerenciador de limpeza chamado n”); cnt significa 0; Vácuo estático * thread_start (argumento inválido (espaço)) time_t start, act; printf (“Um novo cuidadosamente começou n”); pthread_cleanup_push (cleanup_handler, NULL); curr = iniciar implica tempo (NULL); embora (! feito) pthread_testcancel (); / * Cancelar dispositivo * / if (curr