семафор инициализируется со значением 0.POSIX: значение семафора после выхода из sem_wait()
sem_t sem;
sem_init(&sem, 0, 0);
Одна линия исполнения ждет на семафор, а другой один разблокирует его. Во-первых, случай, когда официант должен ждать.
// value is 0
sem_wait(&sem); // blocks
// value is 0
sem_post(&sem);
// value becomes 1
// unblocked
Во-вторых, случай, когда официанту не нужно ждать.
// value is 0
sem_post(&sem);
// value becomes 1
// value is 1
sem_wait(&sem); // does not block
// value has become 0
Проблема заключается в том, что окончательное значение sem
отличается в двух случаях: 1 в первом случае и 0 во втором. Это своего рода состояние гонки.
В идеале проблема не возникает, если:
- , когда значение семафора 0 и
sem_wait()
называется, значение станет -1, а не оставаться 0. Таким образом, окончательное значение будет должно быть 0 в обоих случаях - или существует вариант
sem_post()
, который просыпался бы один процесс или увеличивать значение (при ожидании процессов значение не будет увеличиваться). также в этом случае конечное значение будет 0 в обоих случаях
Есть ли способ решить это несоответствие в POSIX?
Это не то, как функции должны работать, ['sem_post'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_post.html) увеличивает семафор, а [' sem_wait'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_wait.html) уменьшает его? –