Мне нужно к объекту блокирования при чтении из него?

Я пишу программу, где существует объект, совместно использованный несколькими потоками:

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

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

Мои вопросы:

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

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

25
задан Matt Klein 26 May 2015 в 21:49
поделиться

4 ответа

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

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

-121--1581137-

Он чувствителен к культуре, замените его следующим образом:

  value = value.Replace(System.Globalization.CultureInfo.CurrentCulture.NumberFormat.PercentSymbol, "");

Затем проанализируйте его.

-121--1316218-

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

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

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

16
ответ дан 28 November 2019 в 21:43
поделиться

Это должно работать:

for (var i = startOpacity; i <= endOpacity; i++) {
    (function(opacity) {
        setTimeout(function() {SetOpacity(eID, opacity);}, timer * 30);
    })(i);
    timer++;
}

Это работает следующим образом:

  • внутри цикла вы создаете анонимную функцию ( функция (...) {...} ) и немедленно вызовите ее с параметром (вот почему вокруг функции есть скобки() {} , поэтому его можно вызвать, добавив () в параметры конца и прохода)Параметры
  • , переданные этой анонимной функции (значение i , которое является непрозрачностью внутри функции) являются локальными для этой анонимной функции, поэтому они не изменяются на следующих этапах цикла, и вы можете безопасно передать их другой анонимной функции (это в setTimeout )

Исходная версия не работала, потому что:

  • ваша функция, переданная в setTimeout , содержит ссылку на переменную i (не значение), и она получает значение при вызове этой функции, которое не во время добавления ее к setTimeout
  • значение этой переменной изменяется в цикле, и до получения первого значения setTimeout она получает значение endOpacity (последнее значение из для цикла)

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

-121--2367014-

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

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

-121--1581135-

Необходимо ли также блокировать объект при чтении из него?

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

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

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

4
ответ дан 28 November 2019 в 21:43
поделиться

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

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

5
ответ дан 28 November 2019 в 21:43
поделиться
  1. зависит от того, как вы используете и прочитаете его. Если ваш чтение атомная (то есть, не будет прервана путем записи), и нить чтения не имеет зависимости с потоками записи, то вы, возможно, можете пропустить замок чтения. Но если ваша «чтение» операция занимает некоторое время и имеет тяжелое взаимодействие объекта, то вы должны заблокировать его для чтения.

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

3
ответ дан 28 November 2019 в 21:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: