Счастливого Рождества!
Я читаю Маленькая книга семафоров .В книге есть реализация семафоров на C, которую я не совсем понимаю.Смотрите код ниже.Существует эта переменная wakeups .Автор объясняет:
wakeups подсчитывает количество ожидающих сигналов;то есть количество потоков, которые были разбужены, но еще не возобновили выполнение.Причина пробуждений состоит в том, чтобы убедиться, что наши семафоры имеют свойство 3, описанное в разделе 4.3
и
свойство 3: если есть потоки, ожидающие на семафоре, когдапоток выполняет сигнал, затем необходимо разбудить один из ожидающих потоков.
Хорошо, я думаю, что я понимаю значение свойства.Один из ожидающих потоков должен получить мьютекс, а не другой (например, сигнальные потоки). Поправьте меня, если я ошибаюсь.Я не понимаю, как это свойство гарантируется этим механизмом.Я бы сказал, что собственность не гарантирована.Все еще возможно, что не ожидающий процесс получит мьютекс.Чего мне не хватает?
typedef struct {
int value, wakeups;
Mutex *mutex;
Cond *cond;
} Semaphore;
// SEMAPHORE
Semaphore *make_semaphore (int value)
{
Semaphore *semaphore = check_malloc (sizeof(Semaphore));
semaphore->value = value;
semaphore->wakeups = 0;
semaphore->mutex = make_mutex ();
semaphore->cond = make_cond ();
return semaphore;
}
void sem_wait (Semaphore *semaphore)
{
mutex_lock (semaphore->mutex);
semaphore->value--;
if (semaphore->value < 0) {
do {
cond_wait (semaphore->cond, semaphore->mutex);
} while (semaphore->wakeups < 1);
semaphore->wakeups--;
}
mutex_unlock (semaphore->mutex);
}
void sem_signal (Semaphore *semaphore)
{
mutex_lock (semaphore->mutex);
semaphore->value++;
if (semaphore->value <= 0) {
semaphore->wakeups++;
cond_signal (semaphore->cond);
}
mutex_unlock (semaphore->mutex);
}