原子“检查信号并进入系统调用”操作

时间:2013-01-30 08:41:26

标签: c++ linux signals posix

我正在尝试在C ++中实现自己的取消点机制。该代码主要针对Linux,但我希望它可以在POSIX系统中移植。

由于显而易见的原因,每个阻塞系统调用必须是一个取消点,否则线程可能永远阻塞,没有什么能够唤醒它。目前我使用信号来实现这一目标。当线程接收到表示取消请求的特殊信号时,信号处理程序设置线程局部标志。如果该线程在某些系统调用中被阻止,则它将失败并显示errno == EINTR。然后它将有机会检查旗帜。

但很快我发现上述方法并不完美。如果信号先到,然后线程进入阻塞系统调用,它也会进入永久阻塞状态。在每个阻塞调用之前检查标志并不能使事情变得足够好。信号可能在检查后发出:

if(cancelled)
    throw CancellationException();
 // <--- The signal comes here. ---> //
blocking_call();

这是我的问题:有没有办法确保当我进入系统调用时,取消标志未设置?如果没有,设计这样的取消点的常见做法是什么?

1 个答案:

答案 0 :(得分:0)

我会把它作为一个真正的答案。

如果您正在寻找取消pthreads的内容,请查看pthread cancellation handlers。可能会从那里抛出异常吗?