pthread_exit () no manipulador de sinal

(Esta questão pode estar relacionadapthread_exit no manipulador de sinal causa falha de segmentação) Estou escrevendo uma biblioteca de prevenção de leadlock, onde há sempre um thread de verificação fazendo o material gráfico e verifica se há deadlock, se for, então ele sinaliza um dos threads em conflito. Quando esse segmento captura o sinal, ele libera todos os mutex (es) de que é proprietário e sai. Existem múltiplos mutexes de recursos (obviamente) e um mutex de região crítica, todas as chamadas para aquisição, liberação de bloqueio de recursos e cálculos de gráficos devem obter esse bloqueio primeiro. Agora vai o problema. Com 2 threads concorrentes (sem contar o thread de verificação),as vezes o programa trava após um segmento ser morto. No gdb ele está dizendo que o thread morto possui um bloqueio de região crítico, mas nunca o liberou. Depois de adicionar o ponto de interrupção no manipulador de sinal e percorrê-lo,Parece que o bloqueio pertence a outra pessoa (como esperado) antes de pthread_exit (), mas a propriedade magicamente vai para este segmento após pthread_exit () ..

O único palpite que posso imaginar é que o thread a ser morto estava bloqueando em pthread_mutex_lock ao tentar obter o bloqueio de região crítica (porque ele queria outro mutex de recurso), então o sinal veio, interrompendo o pthread_mutex_lock. Como essa ligação não é à prova de sinal, algo estranho aconteceu? Como o manipulador de sinal pode ter retornado e esse segmento pegou o bloqueio e saiu? Idk .. Qualquer insight é apreciado!

questionAnswers(1)

yourAnswerToTheQuestion