3c05a905

Межпроцессное взаимодействие с использованием семафоров


Для синхронизации потоков, исполняющихся в разных процессах, включая Win32 и RTSS процессы, поток в каждом процессе должен иметь свой, уникальный для процесса хэндл RTSS-семафора. Эти хэндлы могут быть получены с помощью вызовов функций RtCreateSemaphore и RtOpenSemaphore.

Использование RtCreateSemaphore

Наиболее простой способ заключается в том, чтобы один поток в каждом процессе вызвал RtCreateSemaphore, передавая идентичную строку-имя семафора в качестве параметра. Первый поток, вызвавший RtCreateSemaphore, заставит систему создать RTSS-объект семафор. Когда остальные потоки будут вызывать RtCreateSemaphore, система определит, что семафор с указанным именем уже существует; в результате новый семафор не создастся, а функция возвратит уникальный для процесса хэндл, идентифицирующий существующий семафор.

Поток может определить, создал ли вызов RtCreateSemaphore новый семафор с помощью вызова функции GetLastError сразу после вызова RtCreateSemaphore. Если GetLastError вернет ERROR_ALREADY_EXISTS,, то новый семафор не был создан.

Использование RtOpenSemaphore

RtOpenSemaphore возвращает хэндл RTSS семафора. Параметр dwDesiredAccess может принимать значения SEMAPHORE_ALL_ACCESS и SYNCHRONIZE. Параметр lpName является оканчивающейся 0 строкой с именем семафора. При вызове RtOpenSemaphore система сканирует все существующие RTSS семафоры на предмет совпадения с именем, указанным в lpName. Если таковой обнаружится, система создаст уникальный для процесса хэндл этого семафора и вернет его вызвавшему потоку. Любой поток в вызывавшем процессе может теперь использовать этот хэндл в любой функции, принимающей в качестве параметра хэндл RTSS семафора. Если семафор с искомым именем не обнаружится, возвращается NULL.

Хотя объект RTSS семафор всегда поддерживается RTSS подсистемой, Win32 программы могут создавать, открывать и ждать RTSS семафоры. Это позволяет осуществлять взаимодействие RTSS и Win32 процессов. Пространство имен семафоров отлично от пространства имен Win32 семафоров.



Содержание раздела