Pergunta

Eu sou em código o desligamento de um servidor multithread.Se tudo correr como ele deve todos os segmentos sair por conta própria, mas existe uma pequena chance de que um thread fica preso.Neste caso, seria conveniente ter um bloqueio não aderir a fim de que eu poderia fazer.

Existe uma maneira de fazer um bloqueio não pthread_join?Algum tipo de tempo de associação seria bom demais.

algo como isto:

foreach thread do
  nb_pthread_join();
    if still running
      pthread_cancel();

Eu posso pensar em mais casos em que um não-bloking junção seria útil.

Como parece que não há nenhuma tal função, então eu já codificados uma solução alternativa, mas não é tão simples como eu gostaria.

Foi útil?

Solução

Como outros têm apontado que não é um não-bloqueio de pthread_join disponível no padrão pthread bibliotecas.

No entanto, dado o seu problema estabelecido (tentando garantir que todos os seus segmentos de ter saído no programa de desligamento) uma função tal não é necessário.Você pode simplesmente fazer isso:

int killed_threads = 0;
for(i = 0; i < num_threads; i++) {
   int return = pthread_cancel(threads[i]);
   if(return != ESRCH)
      killed_threads++;
}
if(killed_threads)
    printf("%d threads did not shutdown properly\n", killed_threads)
else
    printf("All threads exited successfully");

Não há nada de errado com a chamada pthread_cancel em todos os seus segmentos (terminados ou não), assim chamado por todos os seus segmentos não irá bloquear e garantir a saída de thread (limpo ou não).

Que deve qualificar-se como um 'simples' solução.

Outras dicas

Se você estiver executando o aplicativo no Linux, você pode estar interessado em saber que:

int pthread_tryjoin_np(pthread_t thread, void **retval);

int pthread_timedjoin_np(pthread_t thread, void **retval,
                                const struct timespec *abstime);

Ter cuidado, pois o sufixo sugere que, "np" significa "não-portáteis".Eles não são padrão POSIX, o gnu extensões úteis, apesar de.

link para a página de manual

O 'pthread_join' mecanismo é uma conveniência adicional para ser usado, se acontecer de fazer exatamente o que você deseja.Ele não faz nada que você não podia fazer por si, e onde não é exatamente o que você deseja, o código exatamente o que você deseja.

Não há nenhuma razão real que você deve realmente se importa se um thread foi finalizado ou não.O que importa é se o trabalho a thread estava fazendo é concluída.Para dizer que, o segmento de fazer algo para indicar que ele está trabalhando.Como você faz isso depende de qual é a ideal para o seu problema específico, que depende fortemente do que os segmentos estão fazendo.

Começar mudando seu pensamento.Não é uma thread que fica preso, é o que a linha estava fazendo o que fica preso.

Se você está desenvolvendo para o QNX, você pode usar pthread_timedjoin() função.

Caso contrário, você pode criar uma thread separada que irá realizar pthread_join() e alerta o thread principal, ao sinalizar um semáforo, por exemplo, que a criança thread concluir.Esta thread separado pode devolver o que é fica de pthread_join() para permitir que o thread principal determinar não apenas quando a criança completa, mas também o valor que ela retorna.

A resposta depende de qual você precisava para fazer isso.Se você apenas deseja limpar mortos threads, por exemplo, é provavelmente mais fácil apenas para ter um "morto thread de limpeza" thread que loops e associações.

Eu não tenho certeza do que exatamente você quer dizer, mas eu estou supondo que o que você realmente precisa é de uma espera e notificar mecanismo.

Em resumo, aqui está como funciona:Aguarde uma condição para satisfazer com um limite de tempo.A espera vai ser mais se:

  • O tempo limite ocorre, ou
  • Se a condição é satisfeita.

Você pode ter isso em um loop e adicione mais um pouco de inteligência para a sua lógica.O melhor recurso que eu encontrei para esse relacionadas com Pthreads este tutorial:POSIX Threads de Programação (https://computing.llnl.gov/tutorials/pthreads/).

Eu também estou muito surpreso ao ver que não há nenhuma API de tempo de juntar-Pthreads.

Não há cronometrado pthread_join, mas se você está esperando por outra thread bloqueado em condições, você pode usar cronometrado pthread_cond_timed_wait em vez de pthread_cond_wait

Você poderia fazer um byte dentro de um tubo aberto como não-bloqueio de sinal para a outra thread quando o seu feito, em seguida, use um não-bloqueio de leitura para verificar o status do tubo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top