gpt4 book ai didi

c++ - 多线程进程中的信号处理

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:50 25 4
gpt4 key购买 nike

我有一个在多线程进程中处理信号的基本问题。

在我的代码中,我从主线程创建了一个子线程,以监听 SIGALRM 稍后将由主线程触发(使用其他函数,如 timer_create 给我相同的结果,所以请不要关注这个)。

问题是,整个过程没有捕捉到信号,而是以控制台上奇怪的“闹钟”输出终止。

这是我的代码:

#include <iostream>
#include <sys/time.h>
#include <unistd.h>
#include <csignal>

using namespace std;

void* run_something(void* args){
//unblock the SIGALRM to be catched
sigset_t sig;
sigemptyset(&sig);
sigaddset(&sig, SIGALRM);
sigprocmask(SIG_UNBLOCK, &sig, NULL); //tried with pthread_sigmask

//wait for SIGALRM
int catchedSig;
sigwait(&sig, &catchedSig);
cout<<"in sub-thread, SIGALRM catched, return"<<endl;
}

int main(int argc, char** argv){
//block SIGALRM in main thread
sigset_t sig;
sigemptyset(&sig);
sigaddset(&sig, SIGALRM);
sigprocmask(SIG_BLOCK, &sig, NULL);

//create new thread
pthread_t thread;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_create(&thread, &attr, run_something, NULL);

//trigger SIGARLM after 2s
alarm(2); //tried with timer_create/sigevent

//wait
cout<<"in main thread, waiting for sub-thread to terminate"<<endl;
pthread_join(thread, NULL);
cout<<"in main thread, terminating"<<endl;

return EXIT_SUCCESS;
}

预期结果

  • 在主线程中,等待子线程结束
  • 在子线程中,SIGALRM 被捕获,返回
  • 在主线程中,终止

观察结果

  • 在主线程中,等待子线程结束
  • 闹钟

附加信息:我正在使用 g++ (Debian 5.4.0-4) 5.4.0 20160609。

最佳答案

您的 run_something 线程在为该信号调用 sigwait 之前解除对 SIGALRM 的阻塞,但是 this is undefined behavior . sigwait 从待处理(即,阻塞)信号集中删除一个信号。

不要在您的线程中解除阻塞,您会看到您期望的行为。

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

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