Каждая современная ОС обеспечивает сегодня некоторые атомарные операции:
Interlocked*
API<machine/atomic.h>
<atomic.h>
<libkern/OSAtomic.h>
Что-нибудь как этот для Linux?
Проблемы:
__sync_*
не поддерживаются на всех платформах (ARM) и не поддерживаются компилятором Intel.<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.
Darn. Я собирался предложить примитивы GCC, но вы сказали, что они запрещены. : -)
В этом случае я бы сделал #ifdef
для каждой интересующей вас комбинации архитектуры / компилятора и закодировал встроенный asm. И, может быть, проверьте __ GNUC __
или какой-либо подобный макрос и используйте примитивы GCC, если они доступны, потому что использовать их кажется гораздо более правильным. : -)
У вас будет много дублирования, и будет сложно проверить правильность, но, похоже, так поступают во многих проектах, и я добился хороших результатов.
Некоторые подводные камни, которые укусили меня в прошлом: при использовании GCC не забывайте « asm volatile
» и клобберы для «памяти»
и "cc"
и т. д.
Boost, у которого есть лицензия без вмешательства, и другие платформы уже предлагают переносимые атомарные счетчики - при условии, что они поддерживаются на целевой платформе.
Сторонние библиотеки нам полезны. И если по странным причинам ваша компания запрещает вам их использовать, вы все равно можете посмотреть, как они действуют (если лицензия разрешает это для вас), чтобы реализовать то, что вы ищете.