当我尝试制作一个以字符串为键并且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
}
这会产生:
阶段3:pthread_mutex_lock.c:312:__ pthread_mutex_lock_full:断言 `( - (e))!= 3 || !健壮'失败。
答案 0 :(得分:9)
复制互斥锁未定义。尝试在地图中放置指向互斥锁的指针。
编辑这是未定义行为的本质。有时你会幸运(或似乎),有时你却没有。
而不是地图中多个互斥锁的副本,而是将多个指针放入互斥锁。如下所示:
map<string, pthread_mutex_t *> connectedClientsMutexes;
connectedClientsMutexes.insert(pair<string,pthread_mutex_t *>(userName, &myMutex));
pthread_mutex_lock(connectedClientsMutexes[userName]);
据推测,您正在将映射传递给各种线程,因此明智的做法是不在堆栈上分配这些互斥锁,除非您肯定它们不会超出范围。将它们声明为全局变量或动态分配它们并使用pthread_mutex_init()
初始化它们。