2010-10-18 51 views
0

我无法在Win32 Apis中找到任何获取螺旋锁的函数。
是否有原因?如何最好地同步在内核和用户空间之间共享的内存访问,在Windows中

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

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

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

+0

“Ke”表示它是内核模式API;这个API无疑被用户模式同步API使用。您试图完成CriticalSection API没有提供的具体内容是什么? – EricLaw 2010-10-18 13:51:05

+1

你能解释你为什么命名的Win32 API不是你想要的吗? – 2010-10-18 13:52:56

+0

因为如果功能耗尽了所有给定的自旋计数,功能将会休眠。 – Benjamin 2010-10-18 14:22:13

回答

4

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

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

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

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

+0

感谢飞利浦。我编辑了我的问题。 – Benjamin 2010-10-18 14:33:56

0

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

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

相关问题