Подтвердить что ты не робот

Блокированный эквивалент для Linux

В приложении С++ Linux, какой самый простой способ получить функциональность, которую функции Interlocked на Win32 предоставляют? В частности, легкий способ атомарного увеличения или добавления 32 или 64-битных целых чисел?

4b9b3361

Ответ 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.