Русская Википедия:Задача о курильщиках

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Задача о курильщиках (Шаблон:Lang-en) — проблема синхронизации в информатике, первоначально описанная в 1971 году Сухас С. Патилом[1].

Ситуация

Изначально есть три заядлых курильщика, сидящих за столом. Каждому из них доступно бесконечное количество одного из трёх компонентов: у одного курильщика — табака, у второго — бумаги, у третьего — спичек. Для того чтобы делать и курить сигареты, необходимы все три компонента.

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

Курильщики, по условию проблемы, честные: они не прячут компоненты, выданные барменом, — они лишь скручивают сигарету тогда, когда докурят предыдущую. Если бармен кладёт, например, табак и бумагу на стол, пока поставщик спичек курит, то табак и бумага останутся нетронутыми на столе, пока курильщик со спичками не докурит сигарету и только затем не возьмёт табак и бумагу.

Задача

Согласно доводу Патила, задача иллюстрирует ограниченность семафоров Дейкстры, так как обеспечить бесконечное продолжение процесса при соблюдении следующих условий невозможно:

  1. алгоритм решения нельзя модифицировать;
  2. в решении нельзя использовать условные выражения и массивы семафоров.

По мнению критиков работы Патила, второе ограничение является чрезмерным и делает невозможным решение любой нетривиальной задачи.

Решение

Шаблон:Заготовка раздела Если отбросить второе условие, задачу можно решить применением одноместных семафоров (мьютексов).

Данная задача при соблюдении условий решается на многопроцессорных системах с использованием параллельного программированияШаблон:Нет АИ.

См. также

Примечания

Шаблон:Примечания

Литература

Ссылки

Шаблон:Compu-prog-stub