我正在尝试在C ++中实现自己的取消点机制。该代码主要针对Linux,但我希望它可以在POSIX系统中移植。
由于显而易见的原因,每个阻塞系统调用必须是一个取消点,否则线程可能永远阻塞,没有什么能够唤醒它。目前我使用信号来实现这一目标。当线程接收到表示取消请求的特殊信号时,信号处理程序设置线程局部标志。如果该线程在某些系统调用中被阻止,则它将失败并显示errno == EINTR
。然后它将有机会检查旗帜。
if(cancelled)
throw CancellationException();
// <--- The signal comes here. ---> //
blocking_call();
这是我的问题:有没有办法确保当我进入系统调用时,取消标志未设置?如果没有,设计这样的取消点的常见做法是什么?
答案 0 :(得分:0)
我会把它作为一个真正的答案。
如果您正在寻找取消pthreads的内容,请查看pthread cancellation handlers。可能会从那里抛出异常吗?