2010-11-12 2 views
2

Я читаю «Многопоточное, параллельное и распределенное программирование» Грегори Эндрюса, и в этой книге автор упоминает, что он покажет, как использовать блокировки «в сочетании с переменными состояния для имитации мониторов». Я также слышал несколько раз, что «mutex lock + condition variable» является общим шаблоном в программах, использующих потоки Posix.Переменные условий: используется только для имитации мониторов?

Так что мой вопрос: есть ли другие примеры использования переменных условия, кроме этого (используя их в сочетании с замками для имитации мониторов "Если это так, то было бы простой пример использования

ответ

2

монитор позволяет две разные вещи :

  • Мутали исключение - не более одного потока может владеть монитором в любой момент времени
  • сотрудничества - нить владеющего монитора может выбрать, чтобы ждать, пока он не будет разбужен взаимодействующей нитью через уведомление, направленное через монитор

Posix резьб библиотека разделяет эти два проблем в двух различных объектов:

  • взаимное исключение достигается с помощью семафор
  • сотрудничества осуществляется с использованием условия переменной

Предполагается, что сотрудничество в отношении некоторого состояния между потоками. Ожидается, что это состояние будет защищено мьютексом. Таким образом, основная операция ожидания принимает два аргумента:

  • переменного условия ждать уведомления (сигнализация) на
  • семафор защиты общего состояния

Когда поток ожидает переменное состояния используя мьютекс, мьютекс освобождается, и поток укладывается в режим сна. Когда поток просыпается, он снова будет заменять мьютексы.

Сигнал (уведомлять об одном потоке) или широковещание (уведомлять обо всех потоках) переменная условия не требует мьютекса.

Переменные условий предназначены исключительно для этого использования. Можно использовать их как «сон на некоторое время и отпустить эту мьютекс во время сна», используя переменную частного условия, которая никогда не сигнализируется, и время ожидания (pthread_cond_timedwait()).

2

Переменная состояние? всегда используется в сочетании с взаимной блокировкой. Например, когда вы звоните pthread_cond_wait, вы сусло указать не только условие самой переменной, но и семафор, который вы используете с ним.