Может ли кто-нибудь объяснить разницу между этими тремя атомными операциями?
Кажется, я не могу найти документацию о том, что они означают иначе, чем "использование приобретает symantecs", которое я не понимаю.
Благодарю.
Исходя из документации,
InterlockedIncrement "генерирует полный барьер памяти " для каждого вызова. Пункты памяти являются специальными инструкциями для вашего процессора, которые не позволяют им выполнять операции переупорядочения, как это обычно бывает, например, операции загрузки могут быть очень дорогими, поэтому с учетом потока операций, которые выглядят как "добавить к A, добавить в A, загрузить B, добавьте в B ", ЦП попытается изменить его как" загрузить B, добавить в A, добавить в A, добавить в B ", чтобы загрузка B успела закончить, прежде чем понадобится.
Однако это может разрушить логику в параллельных программах, поэтому иногда необходимы барьеры памяти. Они дороги: они, как правило, стоят примерно столько же, сколько промаха в кеше.
InterlockedIncrementAcquire пытается использовать " приобретать семантику ", если поддерживается вашей системой, если нет, она возвращается к InterlockedIncrement. Отправляясь от этого сообщения в блоге,
Приобретение семантики предотвращает переупорядочение памяти чтения-чтения с помощью любой операции чтения или записи, которая следует за ней в программном порядке
Таким образом, приобретение семантики - это ограниченный, менее дорогой вид барьера памяти, который полезен только в определенных ситуациях (когда, очевидно, задействованы только чтения).
Наконец, InterlockedIncrementNoFence не создает никакого барьера памяти - он полностью неконтролируемый, и возможно, что это вызовет проблемы с последовательной согласованностью.