Действительно ли блокировка необходима в этой ситуации?

Действительно ли необходимо защитить доступ к единственной переменной ссылочного типа в многопоточном приложении? Я в настоящее время блокирую ту переменную как это:

private readonly object _lock = new object();
private MyType _value;
public MyType Value
{
  get { lock (_lock) return _value; }
  set { lock (_lock) _value = value; }
}

Но я задаюсь вопросом, действительно ли это необходимо? Разве присвоение значения к полю не является атомарным? Что-нибудь может пойти не так, как надо, если я не блокирую в этом случае?

P.S.: MyType является неизменным классом: все поля установлены в конструкторе и не изменяются. Для изменения чего-то новый экземпляр создан и присвоен переменной выше.

11
задан Tommy Carlier 11 January 2010 в 16:01
поделиться

4 ответа

Быть атомным достаточно редко.

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

I использовал , чтобы полагать, что для того, чтобы сделать вариабельный волатильный летучий, будет достаточно в этой ситуации. Я больше не убежден, что это так. По сути, теперь я стараюсь избегать написания кода без блокировки, когда участвуют общие данные, если я не могу использовать строительные блоки, написанные людьми, которые действительно понимают эти вещи (например, Джо Даффи).

10
ответ дан 3 December 2019 в 05:34
поделиться

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

В вашем случае, незыблемый, я думаю, блокировка не нужна.

-121--2943696-

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

-121--2943693-

Это может быть проблемой. Это не только само задание, которым ты должен заниматься. Из-за кэширования параллельные потоки могут видеть старую версию объекта, если не заблокировать. Так что необходимость блокировки будет зависеть от того, как именно вы ее используете, и вы этого не покажете.

Вот бесплатный образец главы «Параллельное программирование в Windows» , в которой подробно объясняется эта проблема.

4
ответ дан 3 December 2019 в 05:34
поделиться

Для этого есть WOLATILE ключевое слово для этого. Независимо от того, безопасно ли без этого зависит от сценария. Но компилятор может сделать Смешные вещи , такие как реорганизовать порядок работы. Так что даже чтение / запись в одно поле может быть небезопасно.

7
ответ дан 3 December 2019 в 05:34
поделиться

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

В вашем случае, неизменный, я думаю, замок не нужен.

0
ответ дан 3 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

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