2012-02-11 17 views
6

que recibieron ese error:pthread_mutex_lock.c: 62: __pthread_mutex_lock: aserción `mutex -> __ datos .__ propietario == 0' no

pthread_mutex_lock.c:62: __pthread_mutex_lock: Assertion `mutex->_data._owner == 0' failed.

Y no se puede encontrar ninguna causa de ello. Sin embargo no estoy seguro sobre el siguiente fragmento de código:

Declaraciones:

std::mutex lock; 
std::condition_variable cond; 

Secuencia de cerraduras & desbloquea:

std::unique_lock<std::mutex> lk(lock); 

cond.wait(lk); 

lock.unlock(); 

Si quito esta secuencia - todo funciona bien, pero sin ninguna protección. No estoy seguro si uso unique_lock correctamente.

+2

Para el futuro, intente publicar programas cortos, pero completos - http://sscce.org/ :) –

Respuesta

2

std::unique_lock y los otros bloqueos adquieren un mutex en el constructor y lo liberan en destructor. Ha llamado lock.unlock() en su código de forma manual, lo que hace que se llame de manera efectiva dos veces.

Después de eliminar esa declaración, su código debería funcionar correctamente.

+3

O bien, llame a 'lk.unlock()', para que la cerradura sepa que el mutex se ha desbloqueado. (Y tal vez llamar al mutex a algo que no sea "lock", para que no lo confundas con un candado). –

Cuestiones relacionadas