Является ли доступ к переменной в С# атомарной операцией?
Это (плохая) форма шаблона 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
Является ли доступ к переменной в С# атомарной операцией?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.