Атомный читает в C - PullRequest
       40

Атомный читает в C

10 голосов
/ 13 июля 2011

Согласно Являются ли C ++ для чтения и записи int Atomic? , из-за проблем кэширования процессора, чтения целых чисел (и, следовательно, указателей - или, я так полагаю) не являются атомарными в C. , мой вопрос, есть ли какая-то сборка, которую я мог бы использовать, чтобы сделать чтение атомарным, или мне нужно использовать блокировку? Я просмотрел несколько наборов атомарных операций, и пока не могу найти функцию для атомарного чтения.

РЕДАКТИРОВАТЬ: Компилятор: Clang 2.9 РЕДАКТИРОВАТЬ: Платформа: x86 (64-разрядная версия)

Спасибо.

Ответы [ 2 ]

6 голосов
/ 13 июля 2011

В общем, простая атомарная выборка не предоставляется библиотеками атомарных операций, потому что она используется редко;Вы читаете значение, а затем что-то делаете с ним, и во время этого события необходимо удерживать блокировку, чтобы вы знали, что прочитанное значение не изменилось.Таким образом, вместо атомарного чтения есть атомарный тест и набор некоторого вида (например, gcc s __sync_fetch_and_add()), который выполняет блокировку, затем вы выполняете обычные несинхронизированные чтения, пока вы удерживаете блокировку.

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

5 голосов
/ 13 июля 2011

gcc имеет набор встроенных атомарных функций, но не имеет простой атомарной выборки, однако вы можете сделать что-то вроде __sync_fetch_and_add(&<your variable here>, 0);, чтобы обойти эту

Документы GCC здесь , и есть этот пост выше

РЕДАКТИРОВАТЬ: Ах, Clang, я знаю, что LLVM IR содержит атомы, но я не знаю, выставляет ли Clang их каким-либо образом, но, возможно, стоит попробовать, если он жалуется на использование gcc, это может поддержать их. РЕДАКТИРОВАТЬ: хм, кажется, что-то ... Clang Docs не так много, как GCC, хотя, и документы, кажется, предполагают, что это может также сделать GCC.

...