Как проверить значение семафора с помощью оператора '=='?
Семафор объявляется и создается так:
static struct semaphore *done;
done = sem_create("done",0); // semaphore value initialized to zero
Что происходит, когда
if(done==NULL)
{
//Something done here...
}
условие if выполнено выше? поскольку для параметра done задано значение 0, выполняются ли операторы внутри блока if?
2 ответа
done
указатель на семафор и условие done==NULL
проверяет, удалось ли создать новый семафор, и в этом случае done
будет содержать адрес нового семафора, или не удалось, в этом случае done
будет держать NULL
,
Короче говоря, это условие не проверяет состояние семафора, но если оно вообще было создано.
Я отвечаю на этот вопрос относительно реализаций OS161. done - указатель на семафор, и он будет иметь значение NULL, только если sem_create не создает семафор из-за нехватки памяти или других ограничений памяти.
Значение 0, которое передается в качестве параметра функции, которая инициализирует начальный счетчик семафора равным 0. Доступ к счетчику можно получить как done->count, а затем можно выполнить конкретный код в зависимости от значения счетчика.
При программировании для OS161 я решил несколько проблем с синхронизацией с помощью семафоров, вы можете проверить их по ссылке, приведенной ниже:
https://github.com/prathammalik/OS161/tree/master/kern/synchprobs