Ho un problema con i pthreads in cui penso di ottenere un deadlock. Ho creato una coda di blocco che pensavo stesse funzionando, ma dopo aver fatto un po 'di test ho scoperto che se provo e annullo più thread che bloccano il blocking_queue, mi sembra di ottenere un deadlock.deadlock di blocco di C++ pthread deadlock (credo)
La coda di blocco è molto semplice e si presenta così:
template <class T> class Blocking_Queue
{
public:
Blocking_Queue()
{
pthread_mutex_init(&_lock, NULL);
pthread_cond_init(&_cond, NULL);
}
~Blocking_Queue()
{
pthread_mutex_destroy(&_lock);
pthread_cond_destroy(&_cond);
}
void put(T t)
{
pthread_mutex_lock(&_lock);
_queue.push(t);
pthread_cond_signal(&_cond);
pthread_mutex_unlock(&_lock);
}
T pull()
{
pthread_mutex_lock(&_lock);
while(_queue.empty())
{
pthread_cond_wait(&_cond, &_lock);
}
T t = _queue.front();
_queue.pop();
pthread_mutex_unlock(&_lock);
return t;
}
priavte:
std::queue<T> _queue;
pthread_cond_t _cond;
pthread_mutex_t _lock;
}
Per il test, ho creato 4 thread che tirano su questa coda di blocco. Ho aggiunto alcune istruzioni di stampa alla coda di blocco e ogni thread sta per arrivare al metodo pthread_cond_wait(). Tuttavia, quando provo a chiamare pthread_cancel() e pthread_join() su ogni thread il programma si blocca.
Ho anche provato questo con un solo thread e funziona perfettamente.
In base alla documentazione, pthread_cond_wait() è un punto di annullamento, quindi l'annullamento di chiamata su quei thread dovrebbe causare l'interruzione dell'esecuzione (e questo funziona con solo 1 thread). Tuttavia pthread_mutex_lock non è un punto di cancellazione. Potrebbe succedere qualcosa sulla falsariga di quando si chiama pthread_cancel(), il thread cancellato acquisisce il mutex prima di terminare e non lo sblocca, e poi quando il thread successivo viene annullato non può acquisire il mutex e deadlock? O c'è qualcos'altro che sto sbagliando.
Qualsiasi consiglio sarebbe bello. Grazie :)
provare a utilizzare [Helgrind] (http://valgrind.org/info/tools.html#helgrind), è stato utile in passato per me per individuare condizioni di gara e deadlock. – Flexo
L'annullamento può essere ingannevole. Per favore mostraci più della tua logica: qual è lo stato di cancellabilità dei tuoi thread di lavoro?Quali addetti alle pulizie? E esattamente come stai sequenziando le chiamate per annullare/partecipare su più thread? – pilcrow