c# - 防止用户模式 APC 进入用户模式
问题描述
内核模式代码可以通过进入关键或受保护区域或通过提高当前 IRQL来阻止部分或全部异步过程调用 (APC) 。这样,就可以在不受 APC 干扰的情况下执行包含警报等待的代码。
用户模式代码是否有类似的方法来(暂时)禁用当前线程中的用户模式 APC?
对于托管和非托管代码的答案,我会很高兴。我已经验证以下方法不起作用:
- 临界区 (
EnterCriticalSection
/LeaveCriticalSection
) - 标准库互斥锁 (
std::mutex
,std::recursive_mutex
, ...) - 托管同步功能(
lock
语句、MethodImpl(MethodImplOptions.Synchronized)
注释)
解决方案
否。防止用户模式 APC 发生的唯一选项是:
- 一开始就没有调度 APC
- 不执行警报等待
- 在另一个线程上调度 APC
将所有可警报等待移动到另一个没有安排 APC 或首先不允许可警报等待的线程
QueueUserWorkItem
使用时似乎是不错的候选人WT_EXECUTEDEFAULT
:回调函数排队到 [...] 无法执行警报等待的线程。
(感谢RbMm确保评论中没有用于禁用 APC 的用户模式 API)
推荐阅读
- python - 如何使用 python 在树视图中显示来自 sqlite 的数据
- java - 不兼容的类型。找到:'java.lang.Enum',需要:'char、byte、short、int、Character、Byte、Short、Integer、String 或 enum'
- c# - 在 CloudTable 上执行 ExecuteAsync 后,我应该检查 TableResult 的错误代码吗?
- php - 如何使用 codeigniter 连接亚马逊 s3 存储桶数据库(sqlite3)?
- sql-server - 如何在 sql server 中打印?
- postgresql - 如果 pandas 替换特定表,如何保持 postgres 只读权限?
- python - 未找到 Python 请求页面
- excel-formula - 如何在 Excel 中获取 HLOOKUP 的所有匹配项的总和?
- reactjs - 如何将数据传递给流星方法?
- elasticsearch - 填充字段时映射器解析异常