我想等待一个pthread条件变量,但是当我获得sigusr1(或任何其他信号)时,我想停止等待并检测到它因信号而不是信号而停止等待因为pthread_cond_signal或虚假唤醒。我该怎么做?
pthreads程序中处理信号的可靠方法是掩盖您希望在每个线程中处理的所有信号,并创建一个专用的信号处理线程,该线程围绕调用sigwaitinfo()
(或sigtimedwait()
))。
然后,信号处理线程可以使用普通的mutex保护共享变量和 pthread_cond_signal()
/ pthread_cond_broadcast()
唤醒来告知其他有关收到的信号的线程。
在您的示例中,专用的信号处理线程可以设置一个(静音保护的)标志,表明已接收了SIGUSR1
,然后向线程正在等待的条件变量发出信号。等待线程仅需要检查信号标志,除了其在 pthread_cond_wait()
围绕循环中的其他共享状态外,还需要检查信号标志。