Как лучше всего синхронизировать доступ к памяти, совместно используемой ядром и пространством пользователя, в Windows - PullRequest
0 голосов
/ 18 октября 2010

Я не могу найти функцию для получения спин-блокировки в Win32 Apis.
Есть ли причина?

Когда мне нужно использовать спин-блокировку, что мне делать?

Iзнаю, что есть функция CriticalSectionAndSpinCount.
Но это не то, что я хочу.

Редактировать:
Я хочу синхронизировать память, которая будет распределена между пространством ядра и пространством пользователя.- Память будет отображена.
Я должен заблокировать ее, когда получу доступ к структуре данных, и время блокировки будет очень коротким.
Структура данных (предположим, что это очередь) управляет дескрипторами событий для взаимодействия друг с другом.
Какой механизм синхронизации мне использовать?

Ответы [ 2 ]

4 голосов
/ 18 октября 2010

Спин-блокировка явно не подходит для синхронизации на уровне пользователя. От http://www.microsoft.com/whdc/driver/kernel/locks.mspx:

Все типы спиновых блокировок поднимают IRQL DISPATCH_LEVEL или выше. Вращение блокировки являются единственной синхронизацией механизм, который можно использовать в IRQL> = DISPATCH_LEVEL. Код, который содержит спин блокировка работает на IRQL> = DISPATCH_LEVEL, это означает, что поток системы Код переключения (диспетчер) не может запустить и, следовательно, текущий поток не может быть прервано.

Представьте себе, если бы можно было использовать спин-блокировку в пользовательском режиме: внезапно поток не сможет быть прерван. Так что на машине с одним процессором это теперь эксклюзивная ветка в режиме реального времени. Код пользовательского режима теперь будет отвечать за обработку прерываний и других задач уровня ядра. Код больше не может обращаться к какой-либо выгружаемой памяти, а это означает, что код режима пользователя должен знать, какая память в настоящий момент выгружается и действовать соответственно. Кошки и собаки живут вместе, массовая истерия!

Возможно, лучшим вопросом было бы рассказать нам, чего вы пытаетесь достичь, и спросить, какой метод синхронизации был бы наиболее подходящим.

0 голосов
/ 18 октября 2010

Существует управляемый пользовательский режим SpinLock , как описано здесь . Обращайтесь с осторожностью, как рекомендовано в документации - с этими замками легко ошибиться.

Единственный способ получить доступ к этому в нативном коде - через Win32 API, который вы уже назвали - CriticalSectionAndSpinCount и его родные братья.

...