Почему разрешение pthread_cond_wait () иногда вызывать ложное пробуждение повышает производительность? - PullRequest
1 голос
/ 03 апреля 2012

Я понимаю, что pthread_cond_wait () задокументирована для получения ложных пробуждений, и вызывающая сторона должна проверить это условие, и что мотивация для этого состоит в том, чтобы позволить реализациям pthread_cond_wait () иметь лучшую производительность и заставить вызывающую программу создавать больше надежный код.

Тем не менее, я не видел, чтобы кто-то получал конкретную информацию о возможностях, которые дает эта возможность, за исключением упоминания об условиях гонки, которых было бы дорого избегать.

Может, кто-нибудь подробно расскажет о том, какие условия могут возникнуть, чтобы избежать ложных пробуждений и какие аппаратные архитектуры могут вызвать такие сценарии?

1 Ответ

1 голос
/ 03 апреля 2012

Нет никакой гарантии, что ваш поток будет запущен сразу после получения сигнала.Он будет помечен как «готовый» и будет запущен во власти системного планировщика.Между этим временем становится планируемым и фактически запланированным, другой поток мог изменить базовое условие.

Например:

Поток A: ожидание переменной условия.

Тема B: состояние обновления.Переменная условия сигнала.

Поток C: состояние сброса

Поток A: пробуждение.Проверьте базовое состояние, оно не изменилось.

...