在Windows中,如何最好地同步内核和用户空间之间共享的内存访问

时间:2010-10-18 13:49:14

标签: windows winapi synchronization spinlock

我在Win32 Apis中找不到任何获取自旋锁的功能。
有原因吗?

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

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

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

2 个答案:

答案 0 :(得分:4)

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

  

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

想象一下,如果可以在用户模式下进行旋转锁定:突然间线程将无法被抢占。所以在单CPU机器上,这现在是一个独特的实时线程。用户模式代码现在负责处理中断和其他内核级任务。代码无法再访问任何分页内存,这意味着用户模式代码需要知道当前分页的内存并采取相应措施。猫和狗住在一起,大规模歇斯底里!

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

答案 1 :(得分:0)

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

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