(Это повторение: Как правильно прочитать поле Interlocked.Increment'ed int?, но, прочитав ответы и комментарии, я все еще не уверен в правильном ответе.)
Там есть код, который у меня нет, и не могу изменить использование блокировок, которые увеличивают счетчик int (numberOfUpdates) в нескольких разных потоках. Все вызовы используют:
Interlocked.Increment(ref numberOfUpdates);
Я хочу прочитать numberOfUpdates в моем коде. Теперь, поскольку это int, я знаю, что он не может порвать. Но какой лучший способ обеспечить, чтобы я получил самую последнюю ценность? Кажется, мои варианты:
int localNumberOfUpdates = Interlocked.CompareExchange(ref numberOfUpdates, 0, 0);
или
int localNumberOfUpdates = Thread.VolatileRead(numberOfUpdates);
Будут ли работать (в смысле предоставления последней возможной ценности независимо от оптимизации, переупорядочения, кеширования и т.д.)? Один из них предпочтительнее другого? Есть ли третий вариант, который лучше?