2011-12-24 8 views
8

quando cerco di fare una mappa che ha stringa come chiave e pthread_mutex_t come elemento,errore durante l'uso 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 
    } 

questo genera:

phase3: pthread_mutex_lock.c: 312: __pthread_mutex_lock_full: Asserzione `(- (e))! = 3 || ! robusto 'fallito.

+0

il codice a volte funziona ea volte no: S –

risposta

8

Non è definito copiare un mutex. Prova a mettere un puntatore al mutex sulla mappa.

EDIT Questa è la natura del comportamento non definito. A volte sei fortunato (o sembra) e altre volte no.

Invece di copie di più mutex nella mappa si mette più puntatori ai mutex, invece. Quindi, qualcosa di simile a:

map<string, pthread_mutex_t *> connectedClientsMutexes; 

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

pthread_mutex_lock(connectedClientsMutexes[userName]); 

Presumibilmente si sta passando la mappa intorno a varie discussioni così sarebbe saggio non assegnare quei mutex sulla pila a meno che siate positivi non hanno intenzione di andare fuori del campo di applicazione. Dichiarali come globali o allocali dinamicamente e inizializzali con pthread_mutex_init().

+0

Ma voglio aggiungere più di un mutex, la strana che il codice viene eseguito bene a volte ea volte non è in esecuzione :( –