Я играю с атомными чтениями и пишет в настоящее время и ударил стену в своем понимании. Я понимаю, что запись в переменную (например, через приращение) должна быть атомарной, но я не уверен в чтении переменной.Функции для атомарного считывания значения?
Рассмотрите _InterlockedExchangeAdd
на Windows, или __sync_add_and_fetch
на Linux. Я не могу найти функцию, которая атомарно извлекает значение, которое обновляется. Теперь я провел свое исследование перед публикацией здесь, и Are C++ Reads and Writes of an int Atomic? говорит мне, что чтение не является атомарным.
1) Если я использую перечисленные выше функции, как я атомизирую , прочитайте значение, скажем, если возвращаете его из функции?
2) Если бы я не хотел использовать эти функции и просто хотел заблокировать мьютекс перед каждой записью моей «атомной» переменной, то в функции, которая извлекает текущее значение переменной, мне нужно сначала заблокировать мьютексы, скопировать текущее значение, разблокировать мьютексы и вернуть копию?
EDIT
Я использую компилятор, который не имеет доступ к атомным заголовкам, следовательно, должен использовать этот API.
Вы изучали использование [''] (http://en.cppreference.com/w/cpp/atomic/atomic)? –
CoryKramer
Извините, я обновил Q, чтобы показать, что я не могу использовать атомный заголовок. – Wad
Если вы выполняете чтение-изменение-запись, вся операция должна находиться внутри мьютекса. Одной из худших ошибок, которые я должен был отследить, был тот, кто думал, что до тех пор, пока чтение будет в мьютексе, и так было написано, что он мог выпустить его между ними. – stark