В общем, простая атомарная выборка не предоставляется библиотеками атомарных операций, потому что она используется редко;Вы читаете значение, а затем что-то делаете с ним, и во время этого события необходимо удерживать блокировку, чтобы вы знали, что прочитанное значение не изменилось.Таким образом, вместо атомарного чтения есть атомарный тест и набор некоторого вида (например, gcc
s __sync_fetch_and_add()
), который выполняет блокировку, затем вы выполняете обычные несинхронизированные чтения, пока вы удерживаете блокировку.
Исключением являются драйверы устройств, в которых вам, возможно, придется фактически заблокировать системную шину, чтобы получить атомарность по отношению к другим устройствам на шине, или при реализации блокирующих примитивов для библиотек атомарных операций;они по своей сути специфичны для машины, и вам придется углубиться в язык ассемблера.На процессорах x86 существуют различные атомарные инструкции, а также префикс lock
, который можно применять к большинству операций, которые обращаются к памяти и удерживают блокировку шины на время операции;другие платформы (SPARC, MIPS и т. д.) имеют похожие механизмы, но часто мелкие детали отличаются.Вам нужно будет знать процессор, для которого вы программируете, и вполне вероятно, что вы должны знать кое-что об архитектуре шины машины в этом случае.И библиотеки для этого редко имеют смысл, потому что вы не можете удерживать блокировки шины или памяти между входом / выходом функции, и даже с макробиблиотекой нужно быть осторожным из-за того, что можно перемежать обычные операции между вызовами макросов, когда вТот факт, что может сломать блокировку.Почти всегда лучше просто написать весь критический раздел на ассемблере.