ошибка при использовании мьютекса - PullRequest
9 голосов
/ 25 декабря 2011

, когда я пытаюсь создать карту со строкой в ​​качестве ключа и pthread_mutex_t в качестве элемента,

    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 
    }

это генерирует:

phase3: pthread_mutex_lock.c: 312: __pthread_mutex_lock_full: Утверждение `(- (e))! = 3 ||! robust 'не удалось.

1 Ответ

9 голосов
/ 25 декабря 2011

Не допускается копировать мьютекс. Попробуйте поместить указатель на мьютекс на карте.

РЕДАКТИРОВАТЬ Это характер неопределенного поведения. Иногда вам везет (или кажется), а иногда нет.

Вместо того, чтобы копировать несколько мьютексов на карте, вы вместо этого ставите несколько указателей на мьютексы. Так что-то вроде:

map<string, pthread_mutex_t *> connectedClientsMutexes;

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

pthread_mutex_lock(connectedClientsMutexes[userName]);

Предположительно, вы передаете карту разным потокам, поэтому было бы разумно не размещать эти мьютексы в стеке, если вы не уверены, что они не выйдут за рамки видимости. Объявите их как глобальные или динамически распределяйте их и инициализируйте их с pthread_mutex_init().

...