使用互斥锁时出现错误。

9
当我尝试创建一个以字符串为键,以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 
    }

这将生成以下内容:

第三阶段:pthread_mutex_lock.c:312:__pthread_mutex_lock_full:断言`(-(e))!= 3 || !robust'失败。


代码有时候工作有时候不工作 :S - Adam Johns
1个回答

9

复制互斥锁是未定义的行为。尝试将互斥锁的指针放入映射中。

编辑 这就是未定义行为的本质。有时你会运气好(或者看起来是这样),有时你就不会。

在映射中,不要复制多个互斥锁,而是将多个互斥锁的指针放入其中。所以类似这样:

map<string, pthread_mutex_t *> connectedClientsMutexes;

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

pthread_mutex_lock(connectedClientsMutexes[userName]);

假设您正在将地图传递给各个线程,因此最好不要在堆栈上分配这些互斥锁,除非您确定它们不会超出作用域。请将它们声明为全局变量或动态分配它们,并使用pthread_mutex_init()进行初始化。


但我想添加多个互斥锁,奇怪的是代码有时候运行良好,有时候却不运行 :( - Adam Johns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接