2011-12-24 40 views
8

cuando trato de hacer un mapa que tiene cadena como clave y como elemento pthread_mutex_t,error cuando se utiliza mutex

map<string, pthread_mutex_t> connectedClientsMutexes; 

    pthread_mutex_t myMutex;//= PTHREAD_MUTEX_INITIALIZER; 
    connectedClientsMutexes.insert(pair<string,pthread_mutex_t>(userName,myMutex)); 
while (1) 
    { 

    pthread_mutex_lock(&connectedClientsMutexes[userName]); 
    // do something here 
    } 

esto genera:

Phase3: pthread_mutex_lock.c: 312: __pthread_mutex_lock_full: Afirmación `(- (e))! = 3 || ! robusto 'falló.

+0

el código a veces funciona y, a veces, no: S –

Respuesta

8

No está definido copiar un mutex. Intenta poner un puntero al mutex en el mapa.

EDIT Esa es la naturaleza del comportamiento indefinido. A veces tienes suerte (o parece) y otras veces no.

En lugar de copias de varios mutexes en el mapa, en su lugar, coloca varios punteros en los mutexes. Así que algo como:

map<string, pthread_mutex_t *> connectedClientsMutexes; 

connectedClientsMutexes.insert(pair<string,pthread_mutex_t *>(userName, &myMutex)); 

pthread_mutex_lock(connectedClientsMutexes[userName]); 

Es de suponer que están pasando el mapa torno a varios temas por lo que sería prudente no repartir dichas exclusiones mutuas en la pila a menos que esté seguro de que no van a salir de su alcance. Declararlos como globales o asignarlos dinámicamente e inicializarlos con pthread_mutex_init().

+0

Pero quiero agregar más de un mutex, lo extraño es que el código se ejecuta bien a veces y algunas veces no se ejecuta :( –

Cuestiones relacionadas