Насколько я понимаю ваш вопрос, любое решение должно удовлетворять следующим образом:
- Когда меньше чем п нитей находятся в критической секции, поток вызова
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()
по переменным условия. Но: он будет делать больше, чем вам нужно в вашем заявленном вопросе, и если вы используете семафоры, почему бы просто не использовать их простым и простым способом?
_ Есть некоторые проблемы с мультиплексированием, в которых до n потоков могут одновременно запускать свои критические разделы - непонятно. Критический раздел по определению является фрагментом кода, который выполняется одним потоком только за один раз. –
@MaximYegorushkin А, я понимаю. Я расширил использование «критического раздела», чтобы ссылаться на код, который может быть выполнен не более n раз. У вас есть еще один термин для того, что я назвал критической секцией? –
https://en.wikipedia.org/wiki/Critical_section –