|
Параметр lpsa указывает на структуру SECURITY_ATRIBUTES. Параметр fInitialOwner определяет: должен ли поток, создающий mutex, быть первоначальным владельцем этого объекта. Если он равен TRUE, данный поток становится его владельцем, и, следовательно, объект mutex оказывается в занятом состоянии. Любой другой поток, ожидающий этот объект, будет приостановлен, пока первый поток не освободит его. Передача FALSE в параметре fInitialOwner подразумевает, что объект mutex не принадлежит ни одному из потоков и поэтому "рождается" свободным". Первый же поток из числа ожидающих этот объект может занять его и тем самым продолжить свое исполнение.
Параметр lpszMutexName содержит либо NULL, либо адрес строки (с нулевым символом в конце), идентифицирующий объект mutex. Когда приложение вызывает CreateMutex, система создает объект ядра " mutex " и присваивает ему имя, на которое указывает параметр lpszMutexName. Это имя используется при совместном доступе к нему нескольких процессов. CreatMutex возвращает описатель (его значение зависит от конкретного процесса), идентифицирующий новый объект mutex.
Одно из главных отличий объектов mutex от критических разделов в том, что первые способны синхронизировать потоки, выполняемые в разных процессах. С этой целью поток в каждом процессе должен располагать своим, специфичным для данного процесса описателем единственного объекта mutex. Эти описатели можно получить несколькими путями. Наиболее распространенный способ: один из потоков каждого процесса вы-зывает Creat-Mutex и передает ей в параметре lpszMutexName одну и ту же строку. Первый вызов функции приводит к созданию ядра " mutex ", а остальные ее вызовы просто возвращают соответствующим потокам описатели этого объекта, значения которых специфичны для каждого процесса.
Определить, действительно ли CreatMutex создала новый объект mutex, можно через функцию GetLastError (но обращаться к ней нужно сразу после вызова CreatMutex). Если GetLastError возвратит ERROR_ALREADY_EXISTS, значит, новый объект mutex создан не был.
Еще один способ получить описатель mutex - вызвать OpenMutex:
Дата добавления: 2015-07-11; просмотров: 59 | Нарушение авторских прав