2010-01-31 4 views
20

Я пишу программу, где есть объект разделяется несколькими потоками:Нужно ли мне блокировать объект при чтении?

  • A) Несколько потоков записи пишут на объект (все работает один и тот же функцию)
  • В) для чтения нити, которая осуществляет доступ объект каждые 5 секунд
  • C) для чтения потока, который получает доступ к объекту есть запрос пользователя

это, очевидно, необходимо, чтобы блокировать объект при записи на него, так как мы не хотим несколько потоков для ш обряд на объект одновременно.

Мои вопросы:

  1. Это также необходимо блокировать объект при чтении из него?
  2. Правильно ли я думаю, что если мы просто заблокируем объект при записи, достаточно критического раздела; но если мы блокируем объект при чтении или записи, необходим мьютекс?

Я задаю этот вопрос, потому что в Microsoft Office невозможно, чтобы два экземпляра Word могли получить доступ к документу в режиме доступа для чтения/записи; но пока документ открывается в режиме чтения/записи, можно открыть другой экземпляр Word для доступа к документу в режиме только для чтения. Будет ли такая же логика применяться в потоковом режиме?

+2

Полезно посмотреть, как это делают реляционные базы данных, они являются хозяевами доступа к общим данным. – skaffman

ответ

11

Как Офир уже писал - если вы пытаетесь прочитать данные из объекта, другой поток modyfying - вы можете получить данные в каком-то неопределенном состоянии.

Но - если вы уверены, что объект не изменяется, вы можете, конечно, прочитать его из нескольких потоков. В общем, вопрос, который вы задаете, более или менее задан для читателей-писателей - см. http://en.wikipedia.org/wiki/Readers-writers_problem

Наконец, критический раздел является абстрактным термином и может быть реализован с использованием мьютекса или монитора. Синтаксический сахар для критического раздела в java или C# (синхронизированный, блокирующий) использует монитор под обложками.

4

Это необходимо, поскольку в противном случае (если только операции не являются атомарными) вы можете читать промежуточное состояние.

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

+0

Операция записи является атомарной, но большое спасибо за ваш ответ. – Andy

3

Нужно ли также блокировать объект при чтении с него?

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

Правильно ли я считаю, что если мы просто заблокируем объект при записи, достаточно критической секции ; но если мы заблокируем объект при чтении или письменной форме, необходимо использовать мьютексы?

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

+0

Спасибо. Теперь я понимаю, что критические разделы могут использоваться для разных подпрограмм, пока подпрограммы принадлежат одному и тому же процессу. – Andy

1
  1. зависит от того, как вы используете и читаете его. если ваше чтение является атомарным (т. е. не будет прерываться путем записи), и поток чтения не имеет зависимости от потоков записи, тогда вы, возможно, сможете пропустить блокировку чтения. Но если ваша операция «чтения» занимает некоторое время и требует интенсивного вмешательства в объект, вам следует заблокировать его для чтения.

  2. Если ваше чтение занимает очень много времени (то есть, оно слишком долго не задерживает слишком длинные записи), критической секции должно быть достаточно.

0

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