Оператор присваивания не является потокобезопасным.
Это означает, что если ваши потоки только читают массив - если массив был инициализирован при запуске программы и не изменяется - тогда вы в безопасности.
Однако, если существует писатель, который пишет новые значения, вы уязвимы для состояния гонки.
Основная проблема заключается в следующем; читатель начинает читать целое число. Значение загружается из памяти в регистр. В этот момент читатель поменяется. Затем писатель обновляет значение в памяти. Затем считыватель возвращается обратно и воздействует на загруженное им значение, которое больше не является правильным.
Это означает, что такие вещи, как if()
, не работают надежно. Например,
if( int_array[5] == 10 )
{
}
Может сработать, когда значение в памяти int_array[5]
больше не равно 10.
Я верю в C #, у вас должен быть доступ к вызовам функций Interlocked*()
, таким как InterlockedCompareAndSwap()
. Это позволит вам легко достичь безопасности потока в этом случае.