Значение неинициализированного семафора - PullRequest
0 голосов
/ 19 октября 2010

Со ссылкой на семафорную реализацию semaphore.h в Linux, неинициализированный семафор sem_t по умолчанию равен 0?

Я только что обнаружил, что забыл инициализировать свои семафоры до 0. Несмотря на это программаработал нормально без sem_init.

(Для всех пуристов я полностью согласен, что это плохая практика.)

Ответы [ 3 ]

2 голосов
/ 19 октября 2010

Это будет зависеть от того, как / где определяется семафор.

  • Если он определен как (часть) глобальной переменной, то компилятор должен инициализировать его равным 0, если вы этого не сделаетеукажите любое значение
  • Это также верно, когда она является (частью) переменной области блока, объявленной как static.
  • Если она является (частью) не-staticпеременная области видимости, затем начнется с того значения, которое ранее было сохранено в этой ячейке памяти.
2 голосов
/ 19 октября 2010

Я считаю, что это официально "неопределено". То есть это может быть что угодно. В вашем случае, по какой-то причине, он достигает 0, но это просто удача. Завтра это может быть 5.

1 голос
/ 19 октября 2010

Это зависит от компилятора, а не от операционной системы / реализации семафора.В этом случае ответ Барта охватывает стандарт C.

Однако, согласно стандарту Unix , вы даже не должны полагаться на sem_t, равное 0, или даже sem_t *быть NULL;использование sem_init для унитарной переменной должно быть безопасным.Единственное специальное значение, указанное для семафоров, это sem_t * значение SEM_FAILED, а его значение зависит от реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...