【发布时间】:2022-01-20 01:36:26
【问题描述】:
我正在编写一个多线程程序,其中除其他外,我有一个线程侦听套接字以获取传入的网络连接。为了允许中断,我将poll 与signalfd 结合使用(而不是原始的await 调用)。但是,我还需要能够通知潜在中断的其他线程,因此我在专用线程中使用sigwait 调用来等待信号。我试图让比赛发生在下面的代码中:
int main()
{
int sigval = 0;
sigset_t mask;
sigemptyset (&mask);
sigaddset (&mask, SIGINT);
pthread_sigmask(SIG_BLOCK, &mask, nullptr);
int sfd = signalfd(-1, &mask, SFD_NONBLOCK);
auto handler = std::thread([&] {
int signal;
sigwait(&mask, &signal);
sigval = signal;
});
pollfd pfd[1] = {{.fd=sfd, .events=POLLIN}};
int ret = poll(pfd, 1, -1);
std::cout << "Poll returned with revents = " << pfd[0].revents << std::endl;
handler.join();
std::cout << "Handled thread set sigval to: " << sigval << std::endl;
return 0;
}
每次我运行它并用SIGINT 杀死它时,它似乎都可以工作,因为poll 调用返回,sigval 由处理程序线程设置。但是,我的理解是sigwait 会消耗信号,而signalfd 不会。因此,如果在signalfd 收到信号通知之前以某种方式调用了sigwait,则该程序可能会永远挂起(轮询等待未到来的信号)。我假设因为我无法让程序挂起,所以引擎盖下有一些东西可以防止这种情况发生,但我能保证这永远是真的吗?
【问题讨论】:
标签: c++ multithreading signals race-condition