免费注册 查看新帖 |

Chinaunix

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

在多线程的handler中使用signal()是不是不能这样用? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-23 17:17 |只看该作者 |倒序浏览
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <signal.h>

void sig_fn(int signo){
    printf("pthread=%d exit\n",pthread_self());
}

void* fn(void *arg){//这是一个多线程handler
    int num=*(int*)arg;
    free(arg);
   printf("%d\n",pthread_self());
    signal(SIGALRM,sig_fn);安装信号处理函数
    alarm(num);
    pause();
    pthread_exit(0);
}

int main(){
    pthread_t ph1,ph2;
    int *num=(int*)malloc(sizeof(int));
    *num=1;
    pthread_create(&ph1,NULL,fn,num);
    int *num1=(int*)malloc(sizeof(int));
    *num1=2;
    pthread_create(&ph2,NULL,fn,num1);
    printf("%d\n",pthread_self());
    pthread_join(ph1,NULL);
    pthread_join(ph2,NULL);
    return 0;
}

这样做是不是不对,反正我没有得到我想要的结果.

论坛徽章:
0
2 [报告]
发表于 2007-11-23 17:34 |只看该作者
据说标准IO在多线程中是不可重入的。所以在信号处理函数中调用会有问题。

论坛徽章:
0
3 [报告]
发表于 2007-11-24 23:05 |只看该作者
你要什么效果?没看出什么来,出了在信号处理函数中printf会导致死锁之外
我的系统printf是线程安全的,线程安全就意味着有锁,类似的还有malloc,信号处理函数中调用这些函数是错的

论坛徽章:
0
4 [报告]
发表于 2007-11-25 06:28 |只看该作者
原帖由 flw2 于 2007-11-24 23:05 发表
你要什么效果?没看出什么来,出了在信号处理函数中printf会导致死锁之外
我的系统printf是线程安全的,线程安全就意味着有锁,类似的还有malloc,信号处理函数中调用这些函数是错的


  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <stdlib.h>
  4. #include <signal.h>

  5. void sig_fn(int signo){
  6.         printf("pthread=%d exit\n",pthread_self());
  7. }

  8. void* fn(void *arg){
  9.         int num=*(int*)arg;
  10.         free(arg);
  11.         signal(SIGALRM,sig_fn);
  12.         pthread_kill(pthread_self(),SIGALRM);//这样就对啦,原来线程中使用信号跟进程是不一样的。不能在线程中用alarm来发信号,那是进程专用,alarm一下所有线程都收到了,要想单个线程收到信号要用pthread_kill。
  13.         pthread_exit(0);
  14. }

  15. int main(){
  16.         pthread_t ph1,ph2;
  17.         int *num=(int*)malloc(sizeof(int));
  18.         *num=1;
  19.         pthread_create(&ph1,NULL,fn,num);
  20.         int *num1=(int*)malloc(sizeof(int));
  21.         *num1=2;
  22.         pthread_create(&ph2,NULL,fn,num1);
  23.         printf("main=%d\n",pthread_self());
  24.         pthread_join(ph1,NULL);
  25.         pthread_join(ph2,NULL);
  26.         return 0;
  27. }

复制代码




2,难道只要是信号处理函数都不能用printf之类的函数?无论这个信号是在进程还是在线程中?

[ 本帖最后由 xxldc 于 2007-11-25 06:43 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-11-26 16:12 |只看该作者

回复 #4 xxldc 的帖子

2,难道只要是信号处理函数都不能用printf之类的函数?无论这个信号是在进程还是在线程中?

信号处理函数中不能调用任何带有锁的函数
信号处理函数的执行可以发生在任何时候,包括得到锁,再加锁就可能死锁,而且就算不死锁,破坏内部数据结构的可能性也很大,总之不能调用
信号无所谓在线程还是进程中,信号函数会被一个线程执行

信号处理函数做的事情可能少还是比较好的,虽然花一定的时间可以解决很多问题

论坛徽章:
0
6 [报告]
发表于 2007-11-27 15:10 |只看该作者
原帖由 flw2 于 2007-11-26 16:12 发表
2,难道只要是信号处理函数都不能用printf之类的函数?无论这个信号是在进程还是在线程中?

信号处理函数中不能调用任何带有锁的函数
信号处理函数的执行可以发生在任何时候,包括得到锁,再加锁就可能死锁, ...


盼望有段代码演示一下,光看文字理解不了.

论坛徽章:
0
7 [报告]
发表于 2007-11-27 18:37 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP