使用互斥锁时出错

时间:2011-12-24 23:27:46

标签: c++ linux pthreads posix mutex

当我尝试制作一个以字符串为键并且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 || !健壮'失败。

1 个答案:

答案 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()初始化它们。