Как запрограммировать критический раздел для систем чтения-записи? - PullRequest
2 голосов
/ 20 мая 2010

Допустим, у меня есть система чтения-записи, в которой одновременно работают читатель и писатель. «a» и «b» - это две общие переменные, которые связаны друг с другом, поэтому их модификация должна быть атомарной операцией.

Система чтения-записи может быть следующих типов:

  1. р-р
  2. WW
  3. г-ж * * 1 010
  4. г-WW
  5. р-р-ж
  6. р-р-WW

, где
[r: один читатель
рр: множественный читатель
w: один писатель
ww: несколько писателей]

Теперь у нас может быть метод read для читателя и метод write для писателя следующим образом. Я написал их тип системы мудрый.

  1. р-р

    read_method
    { read a; read b; }
    
  2. ш.

    write_method
    { lock(m); write a; write b; unlock(m); }
    
  3. р-р-ж
  4. р-р-WW

    read_method
    { lock(m); read a; read b; unlock(m); }
    
    write_method
    { lock(m); write a; write b; unlock(m); }
    

Для системы с несколькими считывателями доступ к разделяемым переменным не должен быть атомарным.

В системе с несколькими модулями записи доступ к разделяемым переменным должен быть атомарным, поэтому его нужно заблокировать с помощью «m».

Но для систем типа 3–6 правильны ли мои read_method и write_method? Как я могу улучшить?

С уважением,
Сринивас Наяк

Ответы [ 2 ]

0 голосов
/ 20 мая 2010

Если вы хотите использовать Java, вы можете попробовать ReentrantReadWriteLock .

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

0 голосов
/ 20 мая 2010

Если вы хотите использовать .NET, вы можете попробовать ReaderWriterLockSlim . Я считаю, что это дает вам именно ту функциональность, которая вам нужна. Вы также можете прочитать о том, как они реализовали это, чтобы узнать, как реализовать такие блокировки самостоятельно.

...