原子"check signal and enter system call"操作



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

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

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

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

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

我会把它作为一个实际的答案。

如果你想做一些关于取消 pthreads 的事情,看看 pthread 取消处理程序。 从那里抛出你的异常会起作用吗?

相关内容

最新更新