В приложении С++ Linux, какой самый простой способ получить функциональность, которую функции Interlocked на Win32 предоставляют? В частности, легкий способ атомарного увеличения или добавления 32 или 64-битных целых чисел?
Блокированный эквивалент для Linux
Ответ 1
При дальнейшем рассмотрении это выглядит многообещающим. Переполнение стека Yay.
Ответ 2
Intel с открытым исходным кодом ThreadBuildingBlocks имеет шаблон Atomic, который предлагает ту же функциональность, что и класс .NET Interlocked.
В отличие от встроенных модулей gcc Atomic, это кросс-платформа и не зависит от конкретного компилятора. Как правильно указывает Неманья Трифунович, это зависит от сравнения и замены команд CPU, предоставляемых чипами x86 и Itanium. Думаю, вы не ожидали ничего от библиотеки Intel:)
Ответ 3
Всего несколько заметок, чтобы прояснить проблему, которая не имеет ничего общего с Linux.
ОперацииRWM (чтение-изменение-запись), а те, которые не выполняются в одношаговом режиме, нуждаются в аппаратной поддержке для выполнения атомарно; среди которых приращения и декременты, fetch_and_add и т.д.
Для некоторой архитектуры (включая I386, AMD_64 и IA64) gcc имеет встроенную поддержку доступа к атомной памяти, поэтому никакой внешней libray не требуется. Здесь вы можете прочитать некоторую информацию об API.
Ответ 4
Строго говоря, Linux не может предлагать атомные "блокированные" функции, подобные тем, что есть в Win32, просто потому, что эти функции требуют аппаратной поддержки, а Linux работает на некоторых платформах, которые не предлагают эту поддержку. Сказав это, если вы можете сдержать себя на Intel x86/x64, взгляните на реализацию подсчета ссылок в библиотеке общих указателей Boost.
Ответ 5
Функции atomic из Apache Portable Runtime действительно близки к функциям Win32 InterlockedXXX.
Ответ 6
Довольно распространенная библиотека glib, которая используется в GTK и QT-программировании, а также автономная, предлагает множество атомных операций. См. http://library.gnome.org/devel/glib/2.16/glib-Atomic-Operations.html для списка. Существуют функции g_atomic
для большинства операций, поддерживаемых Interlocked в Win32, а также на платформах, где аппаратное обеспечение напрямую поддерживает их, они встроены в необходимый код ассемблера.
Ответ 7
Вы можете вставить в исходный код какой-либо код сборки, чтобы напрямую использовать x68 взаимосвязанные инструкции.
Вы должны использовать операцию lock xadd.
См. например this.