【问题标题】:sigwait() does not work in multithreaded programsigwait() 在多线程程序中不起作用
【发布时间】:2020-05-24 18:58:42
【问题描述】:

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

我正面临使用 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);
    }
}

【问题讨论】:

  • 信号和线程相互过敏。您要么需要踮起脚尖,要么需要隔离。后者更好。

标签: c++ multithreading signals


【解决方案1】:

raise(sig) is the equivalent of calling pthread_kill(pthread_self(), sig).

由于main 线程raise()s 信号,SIGUSR1 将为该线程而不是为任何其他线程生成。因此,您的 signal_thread 将无法为 USR1 发送 sigwait(),这将等待生成它的线程。

【讨论】:

    【解决方案2】:

    问题涉及两个问题:

    首先,main 中的 raise 调用只向主线程发送信号,而不是整个进程。

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

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 2021-08-07
      • 1970-01-01
      相关资源
      最近更新 更多