Не допускается копировать мьютекс. Попробуйте поместить указатель на мьютекс на карте.
РЕДАКТИРОВАТЬ Это характер неопределенного поведения. Иногда вам везет (или кажется), а иногда нет.
Вместо того, чтобы копировать несколько мьютексов на карте, вы вместо этого ставите несколько указателей на мьютексы. Так что-то вроде:
map<string, pthread_mutex_t *> connectedClientsMutexes;
connectedClientsMutexes.insert(pair<string,pthread_mutex_t *>(userName, &myMutex));
pthread_mutex_lock(connectedClientsMutexes[userName]);
Предположительно, вы передаете карту разным потокам, поэтому было бы разумно не размещать эти мьютексы в стеке, если вы не уверены, что они не выйдут за рамки видимости. Объявите их как глобальные или динамически распределяйте их и инициализируйте их с pthread_mutex_init()
.