C ++ pthread bloqueo de cola de bloqueo (creo)

Estoy teniendo un problema con pthreads donde creo que estoy llegando a un punto muerto. Creé una cola de bloqueo que pensé que funcionaba, pero después de hacer más pruebas, descubrí que si intento cancelar varios subprocesos que están bloqueando en la cola de bloqueo, parece que tengo un punto muerto.

La cola de bloqueo es muy simple y se ve así:

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;
}

Para probar, he creado 4 hilos que tiran de esta cola de bloqueo. Agregué algunas declaraciones de impresión a la cola de bloqueo y cada hilo está llegando al método pthread_cond_wait (). Sin embargo, cuando intento llamar a pthread_cancel () y pthread_join () en cada hilo, el programa simplemente se cuelga.

También probé esto con solo un hilo y funciona perfectamente.

De acuerdo con la documentación, pthread_cond_wait () es un punto de cancelación, por lo que llamar a cancelar en esos subprocesos debería hacer que detengan la ejecución (y esto funciona con solo 1 subproceso). Sin embargo, pthread_mutex_lock no es un punto de cancelación. ¿Podría estar sucediendo algo similar a cuando se llama a pthread_cancel (), el hilo cancelado adquiere el mutex antes de terminar y no lo desbloquea, y luego, cuando se cancela el siguiente hilo, no puede adquirir el mutex y los puntos muertos? ¿O hay algo más que estoy haciendo mal?

Cualquier consejo sería encantador. Gracias :

Respuestas a la pregunta(3)

Su respuesta a la pregunta