Проблема читателей-писателей

Проблема читателей-писателей

Проблема читателей-писателей — одна из важнейших задач параллельного программирования. Формулируется она так.

« Есть область памяти, позволяющая чтение и запись. Несколько потоков имеют к ней доступ, при этом одновременно могут читать сколько угодно потоков, но писать — только один. Как обеспечить такой режим доступа? »

Можно обойтись обычным мьютексом, но это неоптимально — компьютерная память, как правило, устроена так, что несколько потоков могут свободно читать и писать её (единственная проблема — нет гарантии, что в процессе обработки переменная внезапно не изменится). У этой проблемы есть несколько вариантов, разные и решения. Кому отдавать приоритет — читателю или писателю — остаётся за программистом.

Содержание

Первая проблема читателей-писателей (приоритет читателя)

Проблема формулируется так.

« Пока память открыта на чтение, давать читателям беспрепятственный доступ. Писатели могут ждать сколько угодно. »

Вторая проблема читателей-писателей (приоритет писателя)

Проблема формулируется так.

« Как только появился хоть один писатель, читателей больше не пускать. При этом читатели могут простаивать. »

Примерное решение:[1]

Глобальные целые readcount=0, writecount=0;
Глобальные мютексы mutex1, mutex2, mutex3, w, r

ЧИТАТЕЛЬ
  mutex3.enter
    r.enter
      mutex1.enter
        readcount = readcount + 1
        if readcount=1 then w.enter
      mutex1.leave
    r.leave
  mutex3.leave

  ...читаем...

  mutex1.enter
    readcount = readcount - 1
    if readcount = 0 then w.leave
  mutex1.leave

ПИСАТЕЛЬ
  mutex2.enter
    writecount = writecount + 1
    if writecount=1 then r.enter
  mutex2.leave

  w.enter
    ...пишем...
  w.leave

  mutex2.enter
    writecount = writecount - 1
    if writecount = 0 then r.leave
  mutex2.leave

Третья проблема читателей-писателей (честное распределение ресурсов)

« Не допускать простоев. Другими словами: независимо от действий других потоков, читатель или писатель должен пройти барьер за конечное время. »
  Глобальные мютексы: no_writers, no_readers, counter_mutex
  Глобальные целые: nreaders=0
  Локальные целые:  prev, current

ПИСАТЕЛЬ:
  no_writers.enter
    no_readers.enter
  no_writers.leave
    ...пишем....
  no_readers.leave

ЧИТАТЕЛЬ:
  no_writers.enter
    counter_mutex.enter
      prev := nreaders
      nreaders := nreaders + 1
    counter_mutex.leave
    if prev = 0  then no_readers.enter
  no_writers.leave

    ...читаем...

  counter_mutex.enter
    nreaders := nreaders - 1;
    current := nreaders;
  counter_mutex.leave;
  if current = 0 then no_readers.leave

В обоих фрагментах псевдокода, если есть атомарные операции наподобие InterlockedIncrement/InterlockedDecrement, от мютексов, охраняющих счётчики, можно избавиться.

Применение в программировании

Зачастую простой мьютекс, защищающий память, неоптимален. Например, в онлайн-игре список игровых комнат изменяется нечасто — когда кто-то из игроков решает открыть новую комнату, например, раз в несколько секунд. Считывается же он за одну секунду десятки раз, и выстраивать клиентов в очередь для этого не имеет смысла.

Подобные механизмы (так называемая блокировка чтения-записи) существуют во многих языках программирования и библиотеках. Например.

  • Embarcadero Delphi: IMultiReadExclusiveWrite.
  • POSIX: pthread_rwlock_t.
  • Java: ReadWriteLock, ReentrantReadWriteLock.
  • .NET Framework: System.Threading.ReaderWriterLockSlim.
  • Boost: boost::shared_mutex.

См. также

Примечания

  1. Communications of the ACM :Concurrent Control with «Readers» and «Writers» P.J. Courtois,* F. H, 1971 [1]

Wikimedia Foundation. 2010.

Игры ⚽ Нужно сделать НИР?

Полезное


Смотреть что такое "Проблема читателей-писателей" в других словарях:

  • Проблема обедающих философов — «Проблема обедающих философов»  классический пример, используемый в информатике для иллюстрации проблем синхронизации в дизайне параллельных алгоритмов и техник решения этих проблем. Проблема была сформулирована в 1965 году Эдсгером… …   Википедия

  • Проблема спящего парикмахера — В информатике проблема спящего парикмахера  классическая проблема синхронизации и межпроцессного взаимодействия (interporcess) в многопроцессорной OS. Проблема заключается в обеспечении процесса, чтобы парикмахер работал, когда есть клиенты… …   Википедия

  • Проблема авторства текстов М. А. Шолохова — Проблема авторства текстов М. А. Шолохова  получивший широкий общественный резонанс комплекс литературоведческих и связанных с ними этических, политических и иных вопросов и споров, возникших после выхода в 1928 г. романа… …   Википедия

  • Проблема авторства произведений Михаила Шолохова — Проблема авторства текстов М. А. Шолохова получивший широкий общественный резонанс комплекс литературоведческих и связанных с ними этических, политических и иных вопросов и споров, возникших после выхода в 1928 г. романа «Тихий Дон»… …   Википедия

  • Задача о курильщиках — (англ. Cigarette smokers problem)  проблема синхронизации в информатике, первоначально описанная в 1971 году Сухас С. Патилом[1]. Содержание 1 Ситуация 2 Задача …   Википедия

  • Русская литература — I.ВВЕДЕНИЕ II.РУССКАЯ УСТНАЯ ПОЭЗИЯ А.Периодизация истории устной поэзии Б.Развитие старинной устной поэзии 1.Древнейшие истоки устной поэзии. Устнопоэтическое творчество древней Руси с X до середины XVIв. 2.Устная поэзия с середины XVI до конца… …   Литературная энциклопедия

  • Пушкин, Александр Сергеевич — — родился 26 мая 1799 г. в Москве, на Немецкой улице в доме Скворцова; умер 29 января 1837 г. в Петербурге. Со стороны отца Пушкин принадлежал к старинному дворянскому роду, происходившему, по сказанию родословных, от выходца "из… …   Большая биографическая энциклопедия

  • Пушкин А. С. — Пушкин А. С. Пушкин. Пушкин в истории русской литературы. Пушкиноведение. Библиография. ПУШКИН Александр Сергеевич (1799 1837) величайший русский поэт. Р. 6 июня (по ст. стилю 26 мая) 1799. Семья П. происходила из постепенно обедневшего старого… …   Литературная энциклопедия

  • Перевод — 1. ТЕОРИЯ ЛИТЕРАТУРНОГО ПЕРЕВОДА. Литературный (или художественный) П. представляет собой проблему, далеко выходящую за пределы чистой литературно лингвистической техники, поскольку каждый перевод есть в той или иной мере идеологическое освоение… …   Литературная энциклопедия

  • Немецкая литература — Литература эпохи феодализма. VIII X века. XI XII века. XII XIII века. XIII XV века. Библиография. Литература эпохи разложения феодализма. I. От Реформации до 30 летней войны (конец XV XVI вв.). II От 30 летней войны до раннего Просвещения (XVII в …   Литературная энциклопедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»