монитор позволяет две разные вещи :
- Мутали исключение - не более одного потока может владеть монитором в любой момент времени
- сотрудничества - нить владеющего монитора может выбрать, чтобы ждать, пока он не будет разбужен взаимодействующей нитью через уведомление, направленное через монитор
Posix резьб библиотека разделяет эти два проблем в двух различных объектов:
- взаимное исключение достигается с помощью семафор
- сотрудничества осуществляется с использованием условия переменной
Предполагается, что сотрудничество в отношении некоторого состояния между потоками. Ожидается, что это состояние будет защищено мьютексом. Таким образом, основная операция ожидания принимает два аргумента:
- переменного условия ждать уведомления (сигнализация) на
- семафор защиты общего состояния
Когда поток ожидает переменное состояния используя мьютекс, мьютекс освобождается, и поток укладывается в режим сна. Когда поток просыпается, он снова будет заменять мьютексы.
Сигнал (уведомлять об одном потоке) или широковещание (уведомлять обо всех потоках) переменная условия не требует мьютекса.
Переменные условий предназначены исключительно для этого использования. Можно использовать их как «сон на некоторое время и отпустить эту мьютекс во время сна», используя переменную частного условия, которая никогда не сигнализируется, и время ожидания (pthread_cond_timedwait()
).