C-与线程的编程:一系列运行后输出正在发生变化


#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<signal.h>
void sig(int signo)
{
    if(signo==SIGUSR1)
        printf("hiiiin");
}
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("heyn");
   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$

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

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

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

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<signal.h>
void sig(int signo)
{
    if(signo==SIGUSR1)
        printf("hiiiin");
}
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("heyn");
   pthread_kill(rid,SIGUSR1);
   /*terminate  thread*/
   pthread_cancel(sid);
   pthread_cancel(rid);
   /* join */
   pthread_join(sid,NULL);
   pthread_join(rid,NULL);
}

使用此代码,您仍然可能将hiiihey混合,但您不应该再有User defined signal 1

最新更新