sigwait() 在多线程程序中不起作用

sigwait() does not work in multithreaded program

本文关键字:程序 不起作用 多线程 sigwait      更新时间:2023-10-16

我正在尝试编写一个多线程程序,其中一个线程(下面的变量线程(负责可能设置为此过程的任何异步信号。

我面对的是使用 sigwait(( 但不对已发送到处理的任何信号做出反应的线程。(如下面的SIGUSR1(。

static void * signal_thread(void *arg = nullptr)
{
int sig = -1;
sigset_t sigset;
sigfillset(&sigset);
pthread_sigmask(SIG_BLOCK, &sigset, NULL);
while(1)
{
int s = sigwait(&sigset, &sig);
if(s == 0)
printf("SIG %d recieved!...n", sig);
usleep(20);
}
}
int main()
{
sigset_t signalset;
pthread_t thread;
pthread_create(&thread, NULL, &signal_thread, nullptr);
sigfillset(&signalset);
pthread_sigmask(SIG_BLOCK, &signalset, NULL);
while(1)
{
raise(SIGUSR1);
usleep(20);
}
}

该问题涉及两个问题:

首先,在主线程中调用 raise 只发送给主线程的信号,而不是整个过程。

其次,在signal_thread中应该使用 std::cout 而不是 printf。

raise(sig)

相当于调用pthread_kill(pthread_self(), sig)

由于main线程raise()信号,因此将为该线程生成SIGUSR1,而不是为任何其他线程生成。 因此,您的signal_thread将无法为 USR1sigwait(),对于生成它的线程,USR1 将保持挂起状态。