免费注册 查看新帖 |

Chinaunix

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

[C] 为什么我明明设置了递归锁,但是锁的时候还是死锁了呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-26 15:19 |只看该作者 |倒序浏览
是在定时器中使用的:
gcc test.c -lpthread -D_GNU_SOURCE
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <sys/time.h>
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. #include <signal.h>
  8. #include <string.h>

  9. pthread_mutex_t _mutex;
  10. pthread_mutexattr_t _attr;

  11. void prompt_info(int signo)
  12. {
  13.     pthread_mutex_lock(&_mutex);
  14.     printf("in signal\n");
  15.     pthread_mutex_unlock(&_mutex);
  16. }
  17. // 建立信号处理机制
  18. void init_sigaction(void)
  19. {
  20.     struct sigaction tact;
  21.    
  22.     /*信号到了要执行的任务处理函数为prompt_info*/
  23.     tact.sa_handler = prompt_info;
  24.     tact.sa_flags = SA_RESTART;
  25.     /*初始化信号集*/
  26.     sigemptyset(&tact.sa_mask);
  27.     /*建立信号处理机制*/
  28.     sigaction(SIGALRM, &tact, NULL);
  29. }
  30. void init_time()
  31. {
  32.     struct itimerval value;
  33.    
  34.     /*设定执行任务的时间间隔*/
  35.     value.it_value.tv_sec = 0;
  36.     value.it_value.tv_usec = 1;
  37.     /*设定初始时间计数*/
  38.     value.it_interval = value.it_value;
  39.     /*设置计时器ITIMER_REAL*/
  40.     setitimer(ITIMER_REAL, &value, NULL);
  41. }

  42. int main()
  43. {
  44.     pthread_mutexattr_init(&_attr);
  45.     pthread_mutexattr_settype(&_attr,PTHREAD_MUTEX_RECURSIVE);
  46.     pthread_mutex_init(&_mutex, &_attr);

  47.     init_sigaction();
  48.     init_time();
  49.     while ( 1 ) {
  50.             pthread_mutex_lock(&_mutex);       
  51.         printf("in main \n");
  52.         pthread_mutex_unlock(&_mutex);
  53.     }
  54.     return 0;
  55. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-05-26 15:29 |只看该作者
回复 1# wwdwwd


    试试

pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);

论坛徽章:
0
3 [报告]
发表于 2010-05-26 15:34 |只看该作者
回复 1# wwdwwd


    我用你的代码没有死锁啊

论坛徽章:
0
4 [报告]
发表于 2010-05-26 15:47 |只看该作者
回复  wwdwwd


    试试

pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
rain_fish 发表于 2010-05-26 15:29



    还是死锁

论坛徽章:
0
5 [报告]
发表于 2010-05-26 15:48 |只看该作者
回复  wwdwwd


    我用你的代码没有死锁啊
rain_fish 发表于 2010-05-26 15:34



    需要多等一会儿,我的是linux。
uname:
Linux skeeter-desktop 2.6.28-18-generic #60-Ubuntu SMP Fri Mar 12 04:40:52 UTC 2010 i686 GNU/Linux
九片_cu 该用户已被删除
6 [报告]
发表于 2010-05-26 15:54 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2010-05-26 15:55 |只看该作者
你的程序都在死循环,printf很快,是不是跟你造成假象了?

这样试试。。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <sys/time.h>
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. #include <signal.h>
  8. #include <string.h>

  9. pthread_mutex_t _mutex;
  10. pthread_mutexattr_t _attr;

  11. void prompt_info(int signo)
  12. {
  13.     pthread_mutex_lock(&_mutex);
  14.     printf("in signal\n");
  15.     pthread_mutex_unlock(&_mutex);
  16. }
  17. // 建立信号处理机制
  18. void init_sigaction(void)
  19. {
  20.     struct sigaction tact;
  21.    
  22.     /*信号到了要执行的任务处理函数为prompt_info*/
  23.     tact.sa_handler = prompt_info;
  24.     tact.sa_flags = SA_RESTART;
  25.     /*初始化信号集*/
  26.     sigemptyset(&tact.sa_mask);
  27.     /*建立信号处理机制*/
  28.     sigaction(SIGALRM, &tact, NULL);
  29. }
  30. void init_time()
  31. {
  32.     struct itimerval value;
  33.    
  34.     /*设定执行任务的时间间隔*/
  35.     value.it_value.tv_sec = 1;
  36.     value.it_value.tv_usec = 1;
  37.     /*设定初始时间计数*/
  38.     value.it_interval = value.it_value;
  39.     /*设置计时器ITIMER_REAL*/
  40.     setitimer(ITIMER_REAL, &value, NULL);
  41. }

  42. int main()
  43. {
  44.     pthread_mutexattr_init(&_attr);
  45.     pthread_mutexattr_settype(&_attr,PTHREAD_MUTEX_RECURSIVE);
  46.     pthread_mutex_init(&_mutex, &_attr);

  47.     init_sigaction();
  48.     init_time();
  49.     int i = 0;
  50.     while ( 1 ) {
  51.             pthread_mutex_lock(&_mutex);        
  52.             sleep(1);
  53.             getchar();
  54.         printf("in main:%d \n", i++);
  55.         pthread_mutex_unlock(&_mutex);
  56.     }
  57.     return 0;
  58. }
复制代码
九片_cu 该用户已被删除
8 [报告]
发表于 2010-05-26 15:55 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2010-05-26 15:55 |只看该作者
多次回车,看看是否死锁了。。。

论坛徽章:
0
10 [报告]
发表于 2010-05-26 16:27 |只看该作者
本帖最后由 wwdwwd 于 2010-05-26 16:28 编辑
建议加-g编译,等出现“死锁”的时侯,pstack查看调用栈,确认是“死锁”,还是别的原因让程序挂掉了,毕竟 ...
九片_cu 发表于 2010-05-26 15:54


pstack老出现错误:
15008: tmp3
'': opening object file: No such file or directory
Could not open object file.


我用pstack 别的进程的时候出现一堆这样的信息,怎么看是否死锁?

9654: ./qq
(No symbols found)
0xb78a8430: ???? (9e83ad8, 2, c7, b7185ff4, 2, b7185ff4)
0xb711974b: ???? (9e83ad8, 2, c7, 9e83ad8, 2, 0) + 50
0xb710bf82: ???? (1, 9dbf600, 3ae674, 5, b70d5e3c, b772eff4) + 20
0xb710c5ba: ???? (9f53ed0, 9f53ed0, b78c6828, 0, 1, 5) + 40
0xb74b27d9: ???? (8209edb, 8209ed5, 0, b78c5ff4, b6ba3438, 1) + 290
0x080fdb87: ???? (81fc270, 805a5c0, bfe550b8, b7749775, 1, bfe550e4) + 50
0xb7749775: ???? (80fda70, 1, bfe550e4, 81fc270, 81fc260, b78b7870) + 401aaf28


另外:我说我看到死锁,使用strace看的:futex(0x804a038, FUTEX_WAIT_PRIVATE, 2, NULL,看到这个就说明发现死锁了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP