Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы / MAKE_posix_creprc_sem_sig.DOC
Скачиваний:
27
Добавлен:
01.05.2014
Размер:
146.94 Кб
Скачать

Int main()

{

sem_t *semp = sem_open("/sem.0", O_CREAT, S_IRWXU, 1);

if (semp==(sem_t*)-1) { perror("sem_open"); return -1; }

if (sem_wait(semp)==-1) perror("sem_wait");

if (sem_post(semp)==-1) perror("sem_post");

if (sem_close(semp)==-1) perror("sem_close");

if (sem_unlink("/sem.0") == -1) perror("sem_unlink");

return 0;

}

Мьютексы

Мьютексы имеют много общего с семафорами. Они также используются для синхронизации потоков управления на основе двух операций:

  • захват мьютекса (функции pthread_mutex_lock() и pthread_mutex_trylock()),

  • освобождение мьютекса (функция pthread_mutex_unlock()).

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

Мьютексы в отличие от семафоров позволяют избежать инверсии приоритетов. Такое название получил феномен, при котором менее приоритетные потоки управления в силу использования средств синхронизации мешают выполнению более приоритетного потока (подробнее см.Планирование. Планирование и средства синхронизации).

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

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

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

Функция pthread_mutex_trylock()аналогична функцииpthread_mutex_lock(), но если указанный мьютекс уже захвачен, то функцияpthread_mutex_trylock()немедленно возвращает управление с соответствующим кодом ошибки.

При освобождении мьютекса функция pthread_mutex_unlock()проверяет, есть ли потоки управления, ожидающие освобождения мьютекса. Если такие потоки есть, то среди них выбирается наиболее приоритетный, а среди потоков с наибольшим приоритетом выбирается тот, который дольше других ждет захвата мьютекса. Этот поток объявляется работоспособным и становится владельцем мьютекса.

Сигналы

Сигналы асинхронно меняют ход выполнения задачи. Любая задача или процедура обслуживания прерываний может "выставить" (или послать) сигнал определенной задаче. Задача, получившая сигнал, немедленно изменяет ход выполнения: вызывается специальный "обработчик сигналов", связанный с данной задачей. Обработчик сигнала - это пользовательская процедура, связанная с конкретным сигналом и выполняющая некоторые действия всякий раз, когда поступает этот сигнал.

Соседние файлы в папке Материалы