【发布时间】:2019-07-27 17:08:08
【问题描述】:
我正在 Windows 内核中运行一个线程,该线程通过共享内存与应用程序通信。一切正常,除了由于睡眠循环而导致通信缓慢。我一直在研究自旋锁、互斥锁和互锁,但无法真正弄清楚这一点。我也考虑过 Windows 事件,但不知道那个事件的性能。请建议什么是更快的解决方案,通过共享内存保持通信可能暗示 Windows 事件。
内核代码
typedef struct _SHARED_MEMORY
{
BOOLEAN mutex;
CHAR data[BUFFER_SIZE];
} SHARED_MEMORY, *PSHARED_MEMORY;
ZwCreateSection(...)
ZwMapViewOfSection(...)
while (TRUE) {
if (((PSHARED_MEMORY)SharedSection)->mutex == TRUE) {
//... do work...
((PSHARED_MEMORY)SharedSection)->mutex = FALSE;
}
KeDelayExecutionThread(KernelMode, FALSE, &PollingInterval);
}
申请代码
OpenFileMapping(...)
MapViewOfFile(...)
...
RtlCopyMemory(&SM->data, WriteData, Size);
SM->mutex = TRUE;
while (SM->mutex != FALSE) {
Sleep(1); // Slow and removing it will cause an infinite loop
}
RtlCopyMemory(ReadData, &SM->data, Size);
更新 1 目前这是我想出的最快的解决方案:
while(InterlockedCompareExchange(&SM->mutex, FALSE, FALSE));
但是我觉得很有趣的是你需要做一个交换并且没有只比较的功能。
【问题讨论】:
标签: c++ windows kernel mutex spinlock