Атомарные операции C ++ для структур без блокировок
Вопрос
Я реализую механизм без блокировки, используя атомарные (двойные) инструкции по сравнению и замене, напримерcmpxchg16b
В настоящее время я пишу это на ассемблере, а затем связываю его.Однако мне было интересно, есть ли способ заставить компилятор сделать это за меня автоматически?например ,окружите блок кода словом "атомарно" и попросите его разобраться, как реализовать код в виде атомарной инструкции в базовой архитектуре процессора (или сгенерировать ошибку во время компиляции, если базовая arch ее не поддерживает)?
P.S.Я знаю, что gcc имеет некоторые встроенные модули (по крайней мере, для CAS)
http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Atomic-Builtins.html#Atomic-Builtins
Решение
Уже вроде как ответил здесь.
Стандарт C ++ 0x предоставит некоторые атомарные типы данных, в основном целочисленные и пустые типы, использующие std::atomic<> шаблон.В этой статье упоминается Проект atomic_ops Бема который вы можете скачать и использовать уже сегодня.
Если нет, то не могли бы вы встроить свой ассемблер в компилятор?Я знаю, что MSVC имеет __азм ключевое слово для встроенных подпрограмм ассемблера.Google говорит ДА, ссагпз я тоже могу это сделать.
Другие советы
Будущий стандарт "C ++ 0x" для C ++ будет поддерживать атомарные операции и c - см., например http://www.open-std.org/JTC1/sc22/wg21/docs/papers/2007/n2427.html для разумно продуманного обсуждения.Конечно, до тех пор, пока указанный предстоящий стандарт не будет одобрен и широко внедрен, нет никакого способа получить такую функциональность "переносимо" между компиляторами;если вас интересуют конкретные компиляторы за пределами gcc, возможно, вы сможете задать другой вопрос конкретно о них.