0

我在 Win32 API 中找不到任何获取自旋锁的函数。
有原因吗?

当我需要使用自旋锁时,我该怎么办?

我知道有一个 CriticalSectionAndSpinCount 函数。
但这不是我想要的。

编辑:
我想同步一个将在内核空间和用户空间之间共享的内存。-内存将被映射。
当我访问数据结构时我应该锁定它,锁定时间会很短。
数据结构(假设它是一个队列)管理事件句柄以相互交互。
我应该使用什么同步机制?

4

2 回答 2

4

自旋锁显然不适合用户级同步。来自http://www.microsoft.com/whdc/driver/kernel/locks.mspx

所有类型的自旋锁都会将 IRQL 提升到 DISPATCH_LEVEL 或更高。自旋锁是唯一可以在 IRQL >= DISPATCH_LEVEL 时使用的同步机制。持有自旋锁的代码以 IRQL >= DISPATCH_LEVEL 运行,这意味着系统的线程切换代码(调度程序)无法运行,因此无法抢占当前线程。

想象一下,如果可以在用户模式下使用自旋锁:突然,线程将无法被抢占。所以在单cpu机器上,这现在是一个独占的实时线程。用户模式代码现在将负责处理中断和其他内核级任务。代码不能再访问任何分页内存,这意味着用户模式代码需要知道当前分页的内存并采取相应的行动。猫狗同居,集体歇斯底里!

也许更好的问题是告诉我们您要完成什么,并询问哪种同步方法最合适。

于 2010-10-18T14:02:21.817 回答
0

有一个托管用户模式SpinLock ,如此处所述。按照文档中的建议小心处理 - 这些锁很容易出错。

在本机代码中访问它的唯一方法是通过您已经命名的 Win32 API -CriticalSectionAndSpinCount及其兄弟姐妹。

于 2010-10-18T14:04:07.003 回答