Операционные системы. Теория и практика. Замятин А.В. - 228 стр.

UptoLike

Составители: 

228
if (pthread_mutex_trylock(&m1)==0)
/* захват! */
break;
/* мьютекс уже заперт */
pthread_mutex_unlock(&m2);
}
/* нет обработки */
pthread_mutex_unlock(&m1);
pthread_mutex_unlock(&m2);
В примере выше поток 1 запирает мьютексы в нужном порядке, а
поток 2 пытается закрыть их по-своему. Чтобы убедиться, что тупик не
возникнет, поток 2 должен аккуратно обращаться с мьютексом 1; если
поток блокировался, ожидая мьютекс, который будет освобожден, он,
вероятно, только что вызвал тупик с потоком 1. Чтобы гарантировать,
что это не случится, поток 2 вызывает pthread_mutex_trylock, который
запирает мьютекс, если тот свободен. Если мьютекс уже заперт, поток 2
получает сообщение об ошибке. В этом случае поток 2 должен освобо-
дить мьютекс 2, чтобы поток 1 мог запереть его, а затем освободить оба
мьютекса.
Синхронизация с использованием семафора
Семафор предназначен для синхронизации потоков по действиям и
данным, и в общем случае способ использования семафора сходен со
способом использования мьютексов.
Семафор (S) это защищенная переменная, значения которой мож-
но опрашивать и менять только при помощи специальных операций P(S)
и V(S) и операции инициализации. Семафор может принимать целое не-
отрицательное значение. При выполнении потоком операции P над се-
мафором S значение семафора уменьшается на 1 при S > 0 или поток
блокируется, «ожидая на семафоре», при S = 0. При выполнении опера-
ции V(S) происходит пробуждение одного из потоков, ожидающих на
семафоре S, а если таковых нет, то значение семафора увеличивается на
1. В простом случае, когда семафор работает в режиме 2-х состояний
(S > 0 и S = 0), его алгоритм работы полностью совпадает с алгоритмом
мьютекса.
Как следует из вышесказанного, при входе в критическую секцию
поток должен выполнять операцию P(S), а при выходе из критической
секции операцию V(S).