免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3347 | 回复: 7
打印 上一主题 下一主题

[函数] 等待条件产生死锁问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-09 22:39 |只看该作者 |倒序浏览
10可用积分
我写了一个等待条件的demo,没想到产生了死锁:


  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <unistd.h>

  5. static pthread_mutex_t gMutex = PTHREAD_MUTEX_INITIALIZER;
  6. static pthread_cond_t gCond = PTHREAD_COND_INITIALIZER;

  7. static int Num = 0;

  8. void* Run1( void* arg )
  9. {
  10.         int err;

  11.         if( 0 != ( err = pthread_mutex_lock( &gMutex ) ) )
  12.         {
  13.                 fprintf( stderr, "Run1 lock error:%s\n", strerror( err ) );
  14.                
  15.                 return NULL;
  16.         }

  17.         fprintf( stderr, "Thread1 runing!\n" );

  18.         while( Num != 100 )
  19.         {
  20.                 pthread_cond_wait( &gCond, &gMutex );
  21.         }

  22.         pthread_mutex_unlock( &gMutex );

  23.         return NULL;
  24. }

  25. void StartThd1()
  26. {
  27.         pthread_t thd;
  28.         int err;

  29.         if( 0 != ( err = pthread_create( &thd, NULL, Run1, NULL ) ) )
  30.         {
  31.                 fprintf( stderr, "Failed to create thread1:%s\n",
  32.                          strerror( err ) );

  33.                 return;
  34.         }

  35.         pthread_join( thd, NULL );
  36. }


  37. void* Run2( void* arg )
  38. {
  39.         int err;

  40.         if( 0 != ( err = pthread_mutex_lock( &gMutex ) ) )
  41.         {
  42.                 fprintf( stderr, "Run2 lock error:%s\n", strerror( err ) );
  43.                
  44.                 return NULL;
  45.         }

  46.         fprintf( stderr, "Thread2 runing!\n" );

  47.         Num = 0;

  48.         while( Num++ != 100 );

  49.         pthread_cond_signal( &gCond );

  50.         pthread_mutex_unlock( &gMutex );

  51.         return NULL;
  52. }

  53. void StartThd2()
  54. {
  55.         pthread_t thd;
  56.         int err;

  57.         if( 0 != ( err = pthread_create( &thd, NULL, Run2, NULL ) ) )
  58.         {
  59.                 fprintf( stderr, "Failed to create thread2:%s\n",
  60.                          strerror( err ) );

  61.                 return;
  62.         }

  63.         pthread_join( thd, NULL );
  64. }

  65. int main( int argc, char** argv )
  66. {
  67.         StartThd1();
  68.         StartThd2();

  69.         return 0;
  70. }

复制代码


thread1一直就死了,thread2一直没有运行.
调换thread1, thread2的顺序也不行,依然死锁.
好像pthread_cond_signal( )和pthread_cond_wait()没有起到作用.
请大家解释一下原因,Thx!!!!!!

最佳答案

查看完整内容

楼主,你要什么效果呢,你的调试信息太少了。你试试下面这个程序#include #include #include #include static pthread_mutex_t gMutex = PTHREAD_MUTEX_INITIALIZER;static pthread_cond_t gCond = PTHREAD_COND_INITIALIZER;static int Num = 0;void* Run1( void* arg ){ int err; if( 0 != ( err = pthread_mutex_lock( &gMutex ) ) ) { fprintf( stderr, "Run1 lock error:%s\n", strerror ...

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
2 [报告]
发表于 2009-10-09 22:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
3 [报告]
发表于 2009-10-09 23:24 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2009-10-10 12:05 |只看该作者
原帖由 c/unix 于 2009-10-9 23:24 发表
问题出在pthread_join这儿,拿掉就好了,main函数sleep一下。

main看似创建了2个线程,其实第2个根本就没创建。

因为Thread1在 pthread_cond_wait 阻塞了,
main又等待Thread1退出,它根本没功夫创建Thr ...

老兄,你试了没有?我去掉StartThd1()的pthread_join后,thread1,thread2都可以运行,
但是没有达到预期的效果,直接输出:
Thread1 runing!
Thread2 runing!
后就退出了
如果去掉StartThd2()的pthread_join,
依然死锁

论坛徽章:
0
5 [报告]
发表于 2009-10-10 12:16 |只看该作者
你想要什么效果?

论坛徽章:
0
6 [报告]
发表于 2009-10-12 23:46 |只看该作者
原帖由 c/unix 于 2009-10-10 12:22 发表
楼主,你要什么效果呢,你的调试信息太少了。
你试试下面这个程序

#include
#include
#include
#include

static pthread_mutex_t gMutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t g ...

大哥,偶要的就是你这个效果.
大哥的代码和我最大的区别是你注释了两个线程中的pthread_join,
我搞不明白为什么这样就ok了?
但是这样的话,也带来了不便:如果线程需要传递变量,那不就行了吗?

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
7 [报告]
发表于 2009-10-13 00:24 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2009-10-15 21:59 |只看该作者
原帖由 c/unix 于 2009-10-13 00:24 发表
我晕啊,
为什么注释掉pthread_join我2楼不是回答的很详细吗
你可以在main最后统一pthread_join 2个线程,你的程序是第2个线程都没创建,怎么出效果啊。
线程传递变量,pthread_create最后一个参数不就是用来 ...


pthread_create最后一个参数的确是做这活的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP