Как выполнить атомарные операции на Linux, которые работают над x86, рукой, GCC и ICC?

Каждая современная ОС обеспечивает сегодня некоторые атомарные операции:

  • Windows имеет Interlocked* API
  • FreeBSD имеет <machine/atomic.h>
  • Солярис имеет <atomic.h>
  • Mac OS X имеет <libkern/OSAtomic.h>

Что-нибудь как этот для Linux?

  • Мне нужен он для работы над большинством поддерживаемых платформ Linux включая: x86, x86_64 и рука.
  • Мне нужен он, чтобы продолжить работать, по крайней мере, GCC и Intel Compiler.
  • Я не должен пользоваться 3-й библиотекой паритета как бойкий или спокойное.
  • Мне нужен он для работы в C++ (C не требуемый)

Проблемы:

  • GCC атомарный builtins __sync_* не поддерживаются на всех платформах (ARM) и не поддерживаются компилятором Intel.
  • AFAIK <asm/atomic.h> не должен использоваться в пространстве пользователя, и я успешно не использовал его вообще. Кроме того, я не уверен, работало ли это с компилятором Intel.

Какие-либо предложения?

Я знаю, что существует много связанных вопросов, но некоторые из них указывают на __sync* который не выполним для меня (ARM) и некоторая точка к asm/atomic.h.

Возможно, существует библиотека встроенного ассемблерного кода, которая делает это для GCC (ICC поддерживает gcc блок)?

Править:

Существует очень частичное решение для, добавляют, операции только (позволяет реализовывать атомарный счетчик, но не свободные структуры блокировки, которые требуют CAS):

Если Вы используете libstc++ (Использование Intel Compiler libstdc++) затем можно использовать __gnu_cxx::__exchange_and_add это определило в <ext/atomicity.h> или <bits/atomicity.h>. Зависит от версии компилятора.

Однако я все еще хотел бы видеть что-то, что поддерживает CAS.

56
задан Ciro Santilli 新疆改造中心法轮功六四事件 16 June 2015 в 10:24
поделиться

2 ответа

Darn. Я собирался предложить примитивы GCC, но вы сказали, что они запрещены. : -)

В этом случае я бы сделал #ifdef для каждой интересующей вас комбинации архитектуры / компилятора и закодировал встроенный asm. И, может быть, проверьте __ GNUC __ или какой-либо подобный макрос и используйте примитивы GCC, если они доступны, потому что использовать их кажется гораздо более правильным. : -)

У вас будет много дублирования, и будет сложно проверить правильность, но, похоже, так поступают во многих проектах, и я добился хороших результатов.

Некоторые подводные камни, которые укусили меня в прошлом: при использовании GCC не забывайте « asm volatile » и клобберы для «памяти» и "cc" и т. д.

3
ответ дан 26 November 2019 в 17:32
поделиться

Boost, у которого есть лицензия без вмешательства, и другие платформы уже предлагают переносимые атомарные счетчики - при условии, что они поддерживаются на целевой платформе.

Сторонние библиотеки нам полезны. И если по странным причинам ваша компания запрещает вам их использовать, вы все равно можете посмотреть, как они действуют (если лицензия разрешает это для вас), чтобы реализовать то, что вы ищете.

1
ответ дан 26 November 2019 в 17:32
поделиться