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