【问题标题】:error while using mutex使用互斥锁时出错
【发布时间】:2012-01-27 11:39:02
【问题描述】:

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

【问题讨论】:

  • 代码有时有效,有时无效:S

标签: c++ linux pthreads posix mutex


【解决方案1】:

复制互斥锁是未定义的。尝试在映射中放置一个指向互斥体的指针。

编辑这就是未定义行为的本质。有时你很幸运(或看起来很幸运),有时却没有。

而不是映射中多个互斥锁的副本,而是放置多个指向互斥锁的指针。所以像:

map<string, pthread_mutex_t *> connectedClientsMutexes;

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

pthread_mutex_lock(connectedClientsMutexes[userName]);

大概您正在将映射传递给各个线程,因此明智的做法是不要在堆栈上分配这些互斥锁,除非您确定它们不会超出范围。将它们声明为全局变量或动态分配它们并使用pthread_mutex_init() 对其进行初始化。

【讨论】:

  • 但是我想添加多个互斥锁,奇怪的是代码有时运行良好有时不运行:(
猜你喜欢
  • 2021-06-11
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 2015-09-10
相关资源
最近更新 更多