pthread_mutex_lock无法返回

aqiang_00 2012-03-05 10:31:33
使用静态mutex,即pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
有n个函数使用了该锁,
fun1()
{
pthread_mutex_lock(&mutex);
.......
pthread_mutex_unlock(&mutex);
}
fun2()
{
pthread_mutex_lock(&mutex);
.......
pthread_mutex_unlock(&mutex);
}
fun3()
{
pthread_mutex_lock(&mutex);
.......
pthread_mutex_unlock(&mutex);
}
.....

系统中有多个线程调用这些fun,运行几个小时后出现了某个fun无法等到mutex的状况。我在每个lock/unlock前后都加了打印,出问题之前打印中出现过连续连个fun都等到mutex的时候,之后的打印出现了一个unlock,但是之后再也没有fun能等到mutex了!
这个问题我怎么也搞不明白,最后就是表现出死锁状态!
求大侠指点!
...全文
365 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsy5211 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 aqiang_00 的回复:]
引用 4 楼 justkk 的回复:
检查一下锁的类型是不是 PTHREAD_MUTEX_RECURSIVE

这种类型允许同一个线程联系多次锁定
但是必须在同样次数的解锁之后,才能被真正释放

pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
这么定义的静态mutex是哪种类型?应该是default的吧
[/Quote]

这个值得考察下,我也没有查到这个静态到底默认哪种类型不过glib上有定义:
/* Mutex initializers. */
#if __WORDSIZE == 64
# define PTHREAD_MUTEX_INITIALIZER \
{ { 0, 0, 0, 0, 0, 0, { 0, 0 } } }
# ifdef __USE_GNU
# define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \
{ { 0, 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0, { 0, 0 } } }
# define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \
{ { 0, 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0, { 0, 0 } } }
# define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \
{ { 0, 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, 0, { 0, 0 } } }
# endif
#else
#[color=#FF0000] define PTHREAD_MUTEX_INITIALIZER \
{ { 0, 0, 0, 0, 0, { 0 } } }
# ifdef __USE_GNU
# define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \
{ { 0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, 0, { 0 } } }
# define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP \
{ { 0, 0, 0, PTHREAD_MUTEX_ERRORCHECK_NP, 0, { 0 } } }
# define PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP \
{ { 0, 0, 0, PTHREAD_MUTEX_ADAPTIVE_NP, 0, { 0 } } }
# endif
#endif[/color]
求解?
Andy520890802 2012-03-09
  • 打赏
  • 举报
回复
高深。。。。
nossiac 2012-03-07
  • 打赏
  • 举报
回复
出问题之前打印中出现过连续连个fun都等到mutex的时候。
这句比较关键,log分析有没有误差啊?
是否出现同一个fun多次lock?
aqiang_00 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qq120848369 的回复:]
楼主请看课本, 使用printf系列函数将会面临线程安全问题, 换用write或者stderr或者setvbuf后再看看是否有连续打印两次lock的情况出现.
[/Quote]
printf确实不是线程安全,会造成打印上的“错乱”,不过是我的问题发生时可以看出打印应该是没有发生“错乱”的
aqiang_00 2012-03-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 justkk 的回复:]
检查一下锁的类型是不是 PTHREAD_MUTEX_RECURSIVE

这种类型允许同一个线程联系多次锁定
但是必须在同样次数的解锁之后,才能被真正释放
[/Quote]
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
这么定义的静态mutex是哪种类型?应该是default的吧
justkk 2012-03-07
  • 打赏
  • 举报
回复
检查一下锁的类型是不是 PTHREAD_MUTEX_RECURSIVE

这种类型允许同一个线程联系多次锁定
但是必须在同样次数的解锁之后,才能被真正释放
qq120848369 2012-03-07
  • 打赏
  • 举报
回复
楼主请看课本, 使用printf系列函数将会面临线程安全问题, 换用write或者stderr或者setvbuf后再看看是否有连续打印两次lock的情况出现.
aqiang_00 2012-03-06
  • 打赏
  • 举报
回复
可以肯定的是fun里面没有死循环发生,线程异常终止不确定有没有,但是进程没有终止。
主要是两个疑点:
1、为什么会有连续两个lock都能拿到锁?这之间没有发生unlock。
2、接着出现了一次unlock,然后的lock再也拿不到锁又是为什么?
另外,调试过程中也把pthread_mutex_lock/pthread_mutex_unlock的返回值做过判断,不曾出现过lock/unlock返回失败情景发生。
qq120848369 2012-03-06
  • 打赏
  • 举报
回复
肯定是func里的代码死循环了呗.
滴答滴答D 2012-03-05
  • 打赏
  • 举报
回复
你的 fun 里面有没有死循环,或者异常终止呢?

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧