【发布时间】:2015-09-16 01:13:19
【问题描述】:
我知道,唯一允许 ISO/C++11 中的信号处理程序做的是读取或写入无锁原子变量或 volatile sig_atomic_t(我相信,POSIX 有点稍微宽松一点,允许调用一堆系统函数)。
我想知道是否有任何方法可以唤醒正在等待条件变量的线程。 IE。类似:
#include <mutex>
#include <atomic>
#include <condition_variable>
std::mutex mux;
std::condition_variable cv;
std::atomic_bool doWait{ true };
void signalHandler(int){
doWait = false;
cv.notify_one();
}
int main() {
//register signal handler
//Do some stuff
{//wait until signal arrived
std::unique_lock<std::mutex> ul(mux);
cv.wait(ul, []{return !doWait; });
}
//Do some more stuff
}
这至少有两个问题:
- 我相信,我不允许在信号处理程序中调用
notify_one()(如果我错了,请纠正我) - 信号可能会在检查
doWait和线程进入睡眠状态之间到达,因此它永远不会唤醒(显然,我无法锁定signalHander 中的互斥锁以避免这种情况)。
到目前为止,我能看到的唯一解决方案是在 doWait 变量上实现忙等待(可能在每次迭代中休眠几毫秒),这让我觉得效率很低。
请注意,尽管我上面的程序只有一个线程,但我用多线程标记了我的问题,因为它是关于线程控制原语的。如果标准 c++ 中没有解决方案,我愿意接受使用 Linux/POSIX 特定功能的解决方案。
【问题讨论】:
标签: c++ linux multithreading signals signal-handling