gpt4 book ai didi

c++ - 取消信号处理程序中的线程

转载 作者:太空狗 更新时间:2023-10-29 12:06:08 24 4
gpt4 key购买 nike

我启动了一个计时器并将间隔设置为 5 秒,并为其注册了一个信号处理程序。当遇到 SIGALRM 时,我试图终止信号处理程序内的线程,但无法做到这一点。线程没有被终止,而不是整个进程被终止。
以下是代码:

 void signalHandler()
{
printf("Caught signal ...\n");
printf("Now going to terminate thread..\n");
pthread_kill(tid, SIGKILL);
}

void * thread_function()
{
int oldstate;
char result[256] = {0};
time_t startTime = time(NULL);
time_t timerDuration = 5;
time_t endTime = startTime + timerDuration;

while(1) {
printf("Timer is runnuing as dameon..\n");
if(!strcmp(result, "CONNECTED")) {
resp = 1;
pthread_exit(&resp);
}
}
}

int main()
{
int *ptr[2];

signal(SIGALRM, signalHandler);

timer.it_interval.tv_usec = 0;
timer.it_interval. tv_usec = 0;

timer.it_value.tv_sec = INTERVAL;
timer.it_value.tv_usec = 0;

setitimer(ITIMER_REAL, &timer, 0);
pthread_create(&tid, NULL, thread_function, NULL);
pthread_join(tid, (void**)&(ptr[0]));
printf("test %d\n\n",*ptr[0]);

while(1)
printf("1");
}

平台:Linux,gcc编译器

最佳答案

据我所知,您几乎不能在信号处理程序中调用任何东西,因为您不知道您的代码处于什么状态。

您最好的选择是设置一个线程来处理您的信号。所有其他线程都应调用 pthread_setsigmask 并阻止所有信号,然后您创建另一个线程,调用 pthread_setsigmask 来捕获 SIGALARM,并且然后调用 sigwait,此时它可以取消另一个线程。

关于c++ - 取消信号处理程序中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11574406/

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