Я запускаю поток в ядре 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));
Однако я нахожу забавным, что вам нужно сделать обмен и что нет функции только для сравнения.