原子"check signal and enter system call"操作
Atomic "check signal and enter system call" operation
我正在尝试在C++中实现自己的取消点机制。该代码主要针对Linux,但我希望它可以在POSIX系统中移植。
出于显而易见的原因,每个阻塞系统调用都必须是一个取消点,否则线程可能会永远阻塞,并且无法唤醒它。目前,我使用信号来实现这一点。当线程收到表示取消请求的特殊信号时,信号处理程序将设置线程本地标志。如果该线程在某些系统调用中被阻塞,它将失败并显示 errno == EINTR
。然后它将有机会检查标志。
但很快我发现上述方法并不完美。如果信号先来,然后线程进入阻塞系统调用,它也会进入永久阻塞。在每次阻止调用之前检查标志并不能使事情变得足够好。信号可能会在检查后出现:
if(cancelled)
throw CancellationException();
// <--- The signal comes here. ---> //
blocking_call();
这是我的问题:有没有办法确保当我输入系统调用时,没有设置取消标志?如果不是,设计此类取消点的常见做法是什么?
我会把它作为一个实际的答案。
如果你想做一些关于取消 pthreads 的事情,看看 pthread 取消处理程序。 从那里抛出你的异常会起作用吗?
相关文章:
- "error: no matching function for call to"构造函数错误
- 调用专用模板时出错"no matching function for call to [...]"
- 如何在c++中使用system()来运行包含空格的python脚本
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- "no matching function for call to 'Vector::Vector'"错误
- C++/CLI System.AccessViolation在托管类中调用非托管函数时出现异常
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 我在 ifstream input_file(文件名)行中收到错误"no matching function to call";
- 模板规范获取'Ambiguous call to overloaded function'
- 程序在使用 system() 启动另一个可执行文件时停止
- 为什么我的 DeviceInformation 对象没有 System.Devices.InterfaceClassGuid 属性?
- 为什么"using System;"不被视为不良做法?
- C++ 合并字符串以'system'函数错误
- 从 TVector2 类派生复杂类:"No matching function for call to Complex::Complex()"
- System.AccessViolationException:shared_ptr C# .NET 和 C++ 应用程
- 将 Vcl::Controls::TCaption aka (System::UnicodeString) 转换为 co
- 对 boost::system::d etail::system_category_instance 的未定义引用,从
- 如何在 C/C++ 中"use the write() system call to read from the page (writing to a dummy pipe() file descri
- call system() return 256
- 原子"check signal and enter system call"操作