gpt4 book ai didi

c - 为什么主线程被杀死后子线程还活着?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:48:25 25 4
gpt4 key购买 nike

我编写了一段代码,其中我从父线程创建了两个子线程。

然后,在这些子线程中从另一个终端接收到信号后,我打印了 threadID 并退出了线程。

我有 2 个问题。

  1. 我正在接收来自子线程的信号。为什么打印父线程的threadID

  2. 杀死父线程后,子线程怎么还活着??

代码:

void sig_handler(int signo)
{
if (signo == 1){
printf("%d\n", pthread_self());
pthread_exit(NULL);
}
}

void* doSomeThing(void* arg)
{
printf("In function -> %d\n", pthread_self());
if (signal(1, sig_handler) == SIG_ERR)
printf("\ncan't catch SIGHUP\n");
while(1)
sleep(1);
return NULL;
}

int main(int argc, char *argv[])
{
printf("In function -> %d\n", pthread_self());
char *ch1;
pthread_t tid1, tid2;
ch1 = "random";
int ret1, ret2;

ret1 = pthread_create(&tid1, NULL, &doSomeThing, (void *) ch1 );
ret2 = pthread_create(&tid2, NULL, &doSomeThing, (void *) ch1 );

while(1)
sleep(1);
return 0;
}

这是终端中给出的输出图像:

前 3 行是 3 个 threadID。第一个是主 threadID,然后是两个辅助线程。

然后 threadID 从以下代码块中打印出来。

if (signo == 1){
printf("%d\n", pthread_self());
pthread_exit(NULL);
}

为什么会这样???

最佳答案

信号被传送到进程,而不是单个线程。所以,你不能像你在这里做的那样只为一个线程设置一个信号处理程序。您可以做的是使用 pthread_sigmask() 阻止您感兴趣的信号。并让专用线程使用 sigwait() 处理信号,这是最常见的方式。

关于c - 为什么主线程被杀死后子线程还活着?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38738704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com