RTX – расширение реального времени для Windows NT

       

Использование мьютексов


RTSS мьютекс – это объект синхронизации, чье состояние является свободным (signalled), когда им не владеет ни один поток, в противном случае он считается занятым (mutex signalled). Мьютекс используется для поочередного доступа к разделяемым ресурсам.

Владение мьютексом

Поток владеет мьютексом от момента выхода из wait функции до вызова RtReleaseMutex. Ни один другой поток не может владеть мьютексом в этом промежутке. Если другой поток вызывает wait функцию в то время, когда мьютекс занят (not signalled), wait функция не вернет управление до тех пор, пока владелец мьютекса его не освободит. Когда владеющий поток заканчивает исполнение, мьютекс переходит в свободное состояние и теряет владельца. Ожидающий поток узнает об “осиротевшем” мьютексе по результату, возвращаемому wait функцией.

Если более одного потока ждут мьютекс, то владение мьютексом получит поток с максимальным приоритетом и он же первым получит управление от wait функции.

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

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

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

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

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


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

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

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

| |


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