Поскольку pthread_cond_signal () разрешено вызывать более одного потока, ожидающего переменную условия.Поэтому вы должны дважды проверить условие, как только проснетесь, потому что какой-то другой поток мог проснуться и изменить его перед вами.
Если вы знаете, что вас ожидает только один поток, и вы уверены, что никто небудущее когда-нибудь изменит код в другом месте программы, чтобы добавить еще один ожидающий поток, тогда вы можете использовать if
.Но вы никогда не узнаете это наверняка, поэтому всегда используйте while
.
[обновление]
. Как отмечает ниндзя в комментарии, мой ответ неполон, так как я не упомянул "ложные пробуждения",Например, стандарт POSIX проясняет, что, если ожидающий поток получает сигнал (например, через kill ()), pthread_cond_wait () может вернуть 0, даже если никакой другой поток не сигнализировал переменную условия.Стандарт (на мой взгляд) неоднозначен относительно того, можно ли разбудить ожидающий поток без всякой причины ... Но суть в следующем: Всегда использовать while
, а не if
.