+ -
当前位置:首页 → 问答吧 → 哥弱弱的问个问题-----结贴。。

哥弱弱的问个问题-----结贴。。

时间:2010-07-22

来源:互联网

本帖最后由 peidright 于 2010-07-22 10:55 编辑
  1. void  thread_sig0(int sig){
  2.     printf("thread_sig0\n");
  3. }
  4. void  thread_sig1(int sig){
  5.     printf("thread_sig1\n");
  6. }
  7. void  thread_sig2(int sig){
  8.     printf("thread_sig2\n");
  9. }

  10. void *thread1(void *arg) {
  11.     signal(SIGINT, thread_sig1);
  12.     while(1)sleep(1);
  13. }

  14. void *thread2(void *arg) {
  15.     signal(SIGINT, thread_sig2);
  16.     while(1)sleep(1);
  17. }

  18. int main()
  19. {
  20.     pthread_t ta, tb;
  21.    signal(SIGINT, thread_sig0);
  22.     pthread_create(&ta, NULL,thread1, NULL);
  23.     sleep(1);
  24.     pthread_create(&tb, NULL, thread2, NULL);
  25.     return 0;
  26. }
复制代码
弱弱的求解释, 当发送SIGINT的时候,程序的输出可能。。。

补充一下,我主要想明白, 下面2点
1.线程之间的信号处理函数是否是共享的?(APUE上是)
2.不是共享的话,那结果是什么? 是共享的话,我的这边为什么老是打印出thread_sig1呢。。

弄明白了,在两个线程创建之间加了个sleep(1);..发现是因为先创建的线程,未必先运行。。。
导致最后实际注册的处理函数是thread1,结贴。。

作者: peidright   发布时间: 2010-07-22

随机吧,谁抢着算谁的。。。测试一下

作者: rain_fish   发布时间: 2010-07-22

测试结果:

[root@localhost test]# ./signal
thread_sig2
thread_sig2
thread_sig2
thread_sig2
thread_sig2

作者: rain_fish   发布时间: 2010-07-22

APUE中说,线程的信号处理函数是共享的。那么。。这里到底注册成功的是哪个信号处理函数呢?

大家帮忙在自己的平台运行下,做下解释。。 我的结果是,总是第一个线程收到信号。。

作者: peidright   发布时间: 2010-07-22

本帖最后由 peidright 于 2010-07-22 10:24 编辑

回复 rain_fish


    我的总是第一个线程 thread_sig1..如果是thread_sig2,应该可以解释通。。
请问你的机器情况,多核,? 64? linux?

作者: peidright   发布时间: 2010-07-22



QUOTE:
回复  rain_fish


    我的总是第一个线程 thread_sig1..如果是thread_sig2,应该可以解释通。。
请问 ...
peidright 发表于 2010-07-22 10:23




    对,多喝,64,linux

作者: rain_fish   发布时间: 2010-07-22

回复 rain_fish


    代码加了2个sleep..能否粘贴代码,再测试下。。

作者: peidright   发布时间: 2010-07-22

If the signal is related to a hardware fault or expiring timer, the signal is sent to the thread whose action caused the event. Other signals, on the other hand, are delivered to an arbitrary thread.

作者: syno_hu   发布时间: 2010-07-22



QUOTE:
回复  rain_fish


    代码加了2个sleep..能否粘贴代码,再测试下。。
peidright 发表于 2010-07-22 10:35



呵呵,一开始我就加了sleep,可不像你那么浪费cpu

作者: rain_fish   发布时间: 2010-07-22

回复 syno_hu


    。。。谁都知道看。。请你发帖之前,认真看贴好么。我这边结果,总是第一个线程。。这样是不正常的。没法解释。

作者: peidright   发布时间: 2010-07-22