ВУЗ:
Составители:
66
// Поток 2:
for (; ;) {
pthread_mutex_lock(&m2);
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), его алгоритм работы полностью совпадает с алгоритмом
мьютекса.
Страницы
- « первая
- ‹ предыдущая
- …
- 64
- 65
- 66
- 67
- 68
- …
- следующая ›
- последняя »