Чтение (просто чтение из чего-то, что было инициализировано ранее) из поля всегда потокобезопасно?
Язык C # гарантирует, что операции чтения и записи последовательно упорядочиваются, когда операции чтения и записи выполняются в одном потоке в разделе 3.10:
Зависимость данных сохраняетсяв потоке исполнения.То есть значение каждой переменной вычисляется так, как если бы все операторы в потоке были выполнены в исходном программном порядке.Правила порядка инициализации сохраняются.
События в многопоточной многопроцессорной системе не обязательно имеют четко определенное согласованное упорядочение во времени относительно друг друга. Язык C # не гарантирует последовательного упорядочения.Последовательность записей, наблюдаемых одним потоком, может наблюдаться в совершенно ином порядке, когда наблюдаются из другого потока, при условии, что не задействована критическая точка выполнения.
Поэтому вопрос не подлежит рассмотрению, поскольку содержит неопределенныйслово.Можете ли вы дать точное определение значения «до» для вас в отношении событий в многопоточной многопроцессорной системе?
Язык гарантирует, что побочные эффекты упорядочены только в отношении критическихТочки исполнения, и даже тогда, не дают каких-либо серьезных гарантий, когда речь идет об исключениях.Снова, чтобы процитировать из раздела 3.10:
Выполнение программы на C # продолжается таким образом, что побочные эффекты каждого исполняющего потока сохраняются в критических точках исполнения.Побочный эффект определяется как чтение или запись энергозависимого поля, запись в энергонезависимую переменную, запись во внешний ресурс и создание исключения.Критическими точками выполнения, в которых должен быть сохранен порядок этих побочных эффектов, являются ссылки на изменчивые поля, операторы блокировки, а также создание и завершение потока.[...] Порядок побочных эффектов сохраняется в отношении изменчивых операций чтения и записи.
Кроме того, среде выполнения не нужно оценивать часть выражения, если она может сделать вывод, что значение этого выражения не используется и что не возникает необходимых побочных эффектов (включая любые, вызванные вызовом метода или обращением к энергозависимому полю).).Когда выполнение программы прерывается асинхронным событием (таким как исключение, выданное другим потоком), не гарантируется, что наблюдаемые побочные эффекты видны в исходном порядке программы.
Всегда ли доступ к объекту из массива или списка всегда потокобезопасен (если вы используете цикл for для перечисления)?
By "Потокобезопасный "Вы имеете в виду, что два потока всегда будут получать согласованные результаты при чтении из списка?Как отмечалось выше, язык C # дает очень ограниченные гарантии для наблюдения результатов при чтении из переменных.Можете ли вы дать точное определение того, что означает «потокобезопасность» для вас при энергонезависимом чтении?
Является ли перечисление всегда / когда-либо потокобезопасным?
Дажев однопоточных сценариях запрещается изменять коллекцию при ее перечислении.Это, безусловно, небезопасно в многопоточных сценариях.
Может ли запись и чтение в конкретное поле когда-либо приводить к поврежденному чтению (половина поля изменяется, а половина все еще остается неизменной)?
Да.Я отсылаю вас к разделу 5.5, в котором говорится:
Чтения и записи следующих типов данных являются атомарными: типы bool, char, byte, sbyte, short, ushort, uint, int, float и reference. Кроме того, чтение и запись перечислимых типов с базовым типом в предыдущем списке также являются атомарными. Чтение и запись других типов, включая long, ulong, double и decimal, а также определяемые пользователем типы, не гарантированно являются атомарными. Помимо библиотечных функций, разработанных для этой цели, нет гарантии атомарного чтения-изменения-записи, например, в случае увеличения или уменьшения.