Является ли доступ к переменной в С# атомарной операцией?

Это (плохая) форма шаблона threads блокировки двойной проверки, который thread не потокобезопасен в C#!

В этом visual-c# коде есть одна большая проблема:

s_Initialized multithreading не изменчив. Это означает, что csharp записи в коде инициализации multithreading могут перемещаться после multithreading того, как для s_Initialized multithread установлено значение true, и threading другие потоки могут видеть c-sharp неинициализированный код, даже visual-c# если для них s_Initialized multithread имеет значение true. Это c-sharp не относится к реализации multi-threaded Microsoft Framework, поскольку threads каждая запись является энергозависимой visual-c# записью.

Но также и в реализации visual-c# Microsoft чтение неинициализированных c#.net данных может быть переупорядочено multithread (т. е. предварительно выбрано c# процессором), поэтому, если threading s_Initialized равно true, чтение multithread данных, которые должны быть c-sharp инициализированы, может привести multi-threaded к чтению старых, неинициализированных csharp данных из-за кэш-попаданий thread ( т. е. чтения переупорядочены).

Например:

Thread 1 reads s_Provider (which is null)  
Thread 2 initializes the data  
Thread 2 sets s\_Initialized to true  
Thread 1 reads s\_Initialized (which is true now)  
Thread 1 uses the previously read Provider and gets a NullReferenceException

Перемещение threads чтения s_Provider перед чтением threading s_Initialized совершенно cross-threading законно, потому что нигде thread нет изменчивого чтения.

Если csharp s_Initialized будет volatile, чтение csharp s_Provider не будет разрешено threading перемещаться до чтения s_Initialized, а c#.net также инициализация Provider visual-c# не может перемещаться после c# того, как s_Initialized установлено cross-threading в true, и теперь все в порядке.

Джо multithreading Даффи также написал статью c# об этой проблеме: Broken variants on double-checked locking

c#

multithreading

2022-10-15T13:43:59+00:00