Cтраница 2
События, мьютексы и семафоры могут иметь имена и храниться в файловой системе, подобно именованным каналам. Несколько процессов могут синхронизироваться друг с другом, открывая одно и то же событие, мьютекс или семафор, что проще, чем создание такого объекта одним процессом и передача другим процессам дубликата дескриптора, хотя такой способ, конечно, также возможен. [16]
Напротив, если мьютекс заблокирован, вызывающий поток блокируется до тех пор, пока другой поток, находящийся к критической области, не выйдет из нее, вызвав процедуру mutex unlock. Если мьютекс блокирует несколько потоков, то из них случайным образом выбирается один. [17]
Критические секции подобны мьютексам, но отличаются тем, что они связаны с адресным пространством создавшего их потока. Поскольку критические секции не являются объектами ядра, у них нет дескрипторов или дескрипторов защиты и они не могут передаваться от одного процесса другому. [18]
Если известно, что мьютексы удерживаются, как правило, в течение 50 мкс, а переключение с одного потока на другой занимает 1 мс, а также 1 мс требует обратное, переключение, то более эффективное решение состоит в простом ожидании освобождения мьютекса в цикле. С другой стороны, если средний мьютекс удерживается на 10 мс, то два переключения контекста являются вполне оправданными. Проблема в том, что длительность нахождения процессов в критических областях может варьироваться в широких пределах, поэтому выбор верного решения непрост. [19]
Если известно, что мьютексы удерживаются, как правило, в течение 50 мкс, а переключение с одного потока на другой занимает 1 мс, а также 1 мс требует обратное переключение, то более эффективное решение состоит в простом ожидании освобождения мьютекса в цикле. С другой стороны, если средний мьютекс удерживается на 10 мс, то два переключения контекста являются вполне оправданными. Проблема в том, что длительность нахождения процессов в критических областях может варьироваться в широких пределах, поэтому выбор верного решения непрост. [20]
Если программа завершила использование мьютекса, то она может вызвать функцию Win32 API: : CloseHandle, чтобы закрыть его дескриптор. [21]
Для синхронизации отдельных процессов используются мьютексы, семафоры или события. При этом каждый процесс получает собственный дескриптор объекта синхронизации. [22]
Первый параметр задает атрибуты защиты мьютекса. При передаче значения NULL ему присваиваются стандартные значения атрибутов, а дескриптор мьютекса устанавливается ненаследуемым ( наследование дескриптора рассмотрено в гл. Во втором параметре описывается начальное состояние мьютекса. Третий параметр задает имя мьютекса. Значение NULL создает мьютекс без имени. Задание имени позволяет получать доступ к мьютексу из другого процесса ( гл. Функция: : CreateMutex возвращает дескриптор, используемый потоками программы для ссылки на мьютекс. [23]
Если другой процесс еще не создал мьютекс с таким же именем, то функция: : OpenMutex завершается неудачно и возвращает NULL. Следовательно, при использовании этого метода доступа к мьютексу необходимо убедиться, что процесс, вызывающий функцию: : CreateMutex, сделает это раньше, чем другой процесс вызовет функцию: : OpenMutex. Если оба процесса получают дескриптор, вызывая функцию: : OpenMutex, то они могут делать это в любом порядке. [24]
![]() |
Основные вызовы управления потоками стандарта POSIX Вызов Описание. [25] |
Синхронизация потоков может осуществляться при помощи мьютексов. Как правило, мьютекс охраняет какой-либо ресурс, например буфер, совместно используемый двумя потоками. [26]
![]() |
Пример инверсии приоритета. [27] |
Во-вторых, если поток ждал семафора, мьютекса или другого события, то когда он отпускается, к его приоритету прибавляется две единицы, если это поток переднего плана ( то есть процесс, управляющий окном, которому в данный момент направляется ввод с клавиатуры), и одна единица в противном случае. Наконец, если поток графического интерфейса пользователя просыпается, потому что стал доступен оконный ввод, он также получает прибавку приоритета по той же самой причине. [28]
Одним из наиболее простых и типичных объектов синхронизации является мьютекс. Этот объект используется для ограничения одновременного доступа к данному ресурсу единственным потоком. [29]
Реализация взаимного исключения зависит от компилятора, но обычно используется мьютекс или бинарный семафор. Поскольку взаимное исключение обеспечивает компилятор, а не программист, вероятность ошибки гораздо меньше. В любом случае программист, пишущий код монитора, не должен задумываться о том, как компилятор организует взаимное исключение. Достаточно знать, что, обеспечив попадание в критические области через процедуры монитора, можно не бояться попадания в критическую область двух процессов одновременно. [30]