2014-10-15 3 views
0

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

monitor.enter(); 
runCriticalSection(); 
monitor.exit(); 

Что мы можем использовать внутри мониторов таким образом, мы можем идти об этом?

Боковой вопрос: Существуют ли стандартные ресурсы для решения этой проблемы? Большая часть того, что я читаю, включает только помещение критического раздела внутри монитора. Для семафоров есть «Маленькая книга семафоров».

+0

_ Есть некоторые проблемы с мультиплексированием, в которых до n потоков могут одновременно запускать свои критические разделы - непонятно. Критический раздел по определению является фрагментом кода, который выполняется одним потоком только за один раз. –

+0

@MaximYegorushkin А, я понимаю. Я расширил использование «критического раздела», чтобы ссылаться на код, который может быть выполнен не более n раз. У вас есть еще один термин для того, что я назвал критической секцией? –

+0

https://en.wikipedia.org/wiki/Critical_section –

ответ

1

Насколько я понимаю ваш вопрос, любое решение должно удовлетворять следующим образом:

  • Когда меньше чем п нитей находятся в критической секции, поток вызова monitor.enter() не должны блокировать-то есть. единственное, что препятствует ее развитию, - это прихоть планировщика.
  • Не более n потоков находятся в критическом разделе в любой момент времени; подразумевая, что
  • Когда поток n + 1 вызывает monitor.enter(), он должен блокироваться до тех пор, пока поток не вызовет monitor.exit().

Насколько я могу сказать, ваши требования эквивалентны следующему:

  • «Монитор» является семафор с начальным значением n.
  • monitor.enter() является semaphore.prolaag() (ака P, decrement или wait)
  • monitor.exit() является semaphore.verhoog() (ака V, increment или signal)

Так вот, семафор реализован из монитора:

monitor Semaphore(n): 
    int capacity = n 
    method enter: 
     while capacity == 0: wait() 
     capacity -= 1 
    method exit: 
     capacity += 1 
     signal() 

Используйте его следующим образом:

shared state: 
    monitor = Semaphore(n) 

each thread: 
    monitor.enter() 
    runCriticalSection() 
    monitor.exit() 

Другой путь

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

Multimonitor(n): 
    method critical_section_a: 
     <statements> 
    method critical_section_b: 
     <statements> 

И пробежки -time обеспечит, чтобы в любом из методов мониторинга было задействовано не более n потоков (в вашем случае вам нужен только один метод). Я не знаю такой возможности в любом языке программирования или среде выполнения.

Возможно, в python вы можете создать класс Multimonitor, содержащий все переменные бухгалтерского учета, затем подкласс от него и поставить декораторы на все методы; решение, связанное с метаклассом, может выполнить декорирование для пользователя.

Третий вариант

Если вы реализуете мониторов с помощью семафоров, вы часто используете семафор как мьютекс вокруг входа монитора и точки возобновления. Я думаю, вы могли бы инициализировать такой семафор со значением, большим одного, и таким образом создать такой Мультимонитор, содержащий wait() и signal() по переменным условия. Но: он будет делать больше, чем вам нужно в вашем заявленном вопросе, и если вы используете семафоры, почему бы просто не использовать их простым и простым способом?

Смежные вопросы