Блокированный эквивалент в Linux - PullRequest
12 голосов
/ 29 сентября 2008

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

Ответы [ 7 ]

8 голосов
/ 29 сентября 2008

Несколько замечаний, чтобы прояснить проблему, которая не имеет ничего общего с Linux .

RWM (чтение-изменение-запись) и операции, которые не выполняются за один шаг, требуют аппаратной поддержки для выполнения атомарно ; среди них увеличение и уменьшение, fetch_and_add и т. д.

Для некоторых архитектур (включая I386, AMD_64 и IA64) gcc имеет встроенную поддержку атомарного доступа к памяти, поэтому не требуется никакого внешнего libray. Здесь вы можете прочитать некоторую информацию об API.

8 голосов
/ 29 сентября 2008

Intel с открытым исходным кодом ThreadBuildingBlocks имеет шаблон Atomic, который предлагает ту же функциональность, что и класс Interlocked .NET.

В отличие от встроенных модулей gcc Atomic, он кроссплатформенный и не зависит от конкретного компилятора. Как правильно указал выше Неманья Трифунович, это зависит от инструкции сравнения и замены , предоставляемой чипами x86 и Itanium. Я думаю, вы не ожидаете ничего другого от библиотеки Intel:)

6 голосов
/ 29 сентября 2008

Строго говоря, Linux не может предлагать атомарные «взаимосвязанные» функции, как в Win32, просто потому, что эти функции требуют аппаратной поддержки, а Linux работает на некоторых платформах, которые не поддерживают эту функцию. Сказав это, если вы можете ограничиться Intel x86 / x64, взгляните на реализацию подсчета ссылок в библиотеке общих указателей Boost.

3 голосов
/ 30 сентября 2008

Функции atomic из Apache Portable Runtime действительно близки к функциям Win32 InterlockedXXX.

2 голосов
/ 02 декабря 2008

Довольно распространенная библиотека glib, которая используется в программировании на GTK и QT, а также в автономном режиме, предлагает различные элементарные операции. См. http://library.gnome.org/devel/glib/2.16/glib-Atomic-Operations.html для списка. Для большинства операций, которые Interlocked поддерживает в Win32, есть функции g_atomic, а на платформах, где это непосредственно поддерживается оборудованием, они указываются как необходимый код сборки.

2 голосов
/ 01 декабря 2008

Вы можете вставить некоторый ассемблерный код в исходный код, чтобы напрямую использовать блокированные инструкции x68.

Вы должны использовать операцию lock xadd .

См., Например, this .

0 голосов
/ 29 сентября 2008

После дальнейшего рассмотрения, это выглядит многообещающе. Переполнение стека Yay.

...