代码之家  ›  专栏  ›  技术社区  ›  Harikrishna Patibandla

使用线程编程:在一系列运行[关闭]后,输出正在更改

  •  0
  • Harikrishna Patibandla  · 技术社区  · 7 年前
    #include<stdio.h>
    #include<pthread.h>
    #include<unistd.h>
    #include<signal.h>
    void sig(int signo)
    {
        if(signo==SIGUSR1)
            printf("hiiii\n");
    }
    void * runner(void * param)
    {
        signal(SIGUSR1,sig);
        while(1)
            sleep(1);
    }
    int main()
    {
       pthread_t rid,sid;
       pthread_attr_t attr;
       pthread_attr_init(&attr);
       pthread_create(&sid,&attr,runner,NULL);  
       pthread_create(&rid,&attr,runner,NULL);
       //sleep(1);
       pthread_kill(sid,SIGUSR1);
       printf("hey\n");
       pthread_kill(rid,SIGUSR1);
       pthread_join(rid,NULL);
    }
    

    输出:

    harikrishna@harikrishna:~/Desktop/Ass3b_43$ ./a.out
    User defined signal 1
    harikrishna@harikrishna:~/Desktop/Ass3b_43$ ./a.out
    User defined signal 1
    harikrishna@harikrishna:~/Desktop/Ass3b_43$ ./a.out
    User defined signal 1
    harikrishna@harikrishna:~/Desktop/Ass3b_43$ ./a.out
    User defined signal 1
    harikrishna@harikrishna:~/Desktop/Ass3b_43$ ./a.out
    User defined signal 1
    harikrishna@harikrishna:~/Desktop/Ass3b_43$ ./a.out
    User defined signal 1
    harikrishna@harikrishna:~/Desktop/Ass3b_43$ ./a.out
    User defined signal 1
    harikrishna@harikrishna:~/Desktop/Ass3b_43$ ./a.out
    hey
    hiiii
    hiiii
    ^C
    harikrishna@harikrishna:~/Desktop/Ass3b_43$
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Mathieu Shrikanth M D    7 年前

    您遇到的问题是,您从线程注册了信号处理程序。 由于线程不同步,因此可以在注册处理程序之前将信号发送到线程。

    当你看到“ User defined signal 1 ,这意味着您在注册信号处理程序之前向线程发送信号。

    由于信号处理程序在线程之间共享,因此不必从线程中注册:可以在创建线程之前注册:

    #include<stdio.h>
    #include<pthread.h>
    #include<unistd.h>
    #include<signal.h>
    
    void sig(int signo)
    {
        if(signo==SIGUSR1)
            printf("hiiii\n");
    }
    
    void * runner(void * param)
    {        
        while(1)
            sleep(1);
    }
    
    int main()
    {
       pthread_t rid,sid;
       pthread_attr_t attr;
    
       /* register signal handler */
       signal(SIGUSR1,sig);       
    
       /* create thread */
       pthread_attr_init(&attr);
       pthread_create(&sid,&attr,runner,NULL);  
       pthread_create(&rid,&attr,runner,NULL);
    
       /* send signals */
       pthread_kill(sid,SIGUSR1);
       printf("hey\n");
       pthread_kill(rid,SIGUSR1);
    
       /*terminate  thread*/
       pthread_cancel(sid);
       pthread_cancel(rid);
    
       /* join */
       pthread_join(sid,NULL);
       pthread_join(rid,NULL);
    }
    

    使用此代码,您仍然可以 hiii hey 混合,但你不应该再 用户定义信号1