c - 使用线程编程 : output is changing after a series of runs

标签 c multithreading pthreads

#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”时,这意味着您在注册信号处理程序之前将信号发送到线程。

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

#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);
}

使用此代码,您仍然可以混合使用 hiiihey,但您不应再拥有用户定义的信号 1

关于c - 使用线程编程 : output is changing after a series of runs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48680654/

相关文章:

c - 将字符串 "comes from a file "解析为整数

c - 删除数组中的元素并向左移动元素以缩小间隙

c - 图像抖动 : How would I calculate quantization error and nearest colour to implement in a Floyd-Steinburg algorithm?

c# - `lock`(监视器)在 .NET 中如何工作?

ios - 滚动 UIScrollView - 阻塞主线程

c - 主线程调用pthread_exit后,它变成了僵尸。出了什么问题吗?

c# - 将 Posix 线程转换为 C# 线程,反之亦然

c - 显示固定值的浮点值

iphone - 如何在代码块中通过引用使用变量?

C 线程参数