C ++ атомарные операции для структур без блокировки - PullRequest
12 голосов
/ 31 мая 2009

Я реализую механизм без блокировки, используя атомарные (двойные) инструкции сравнения и обмена, например, cmpxchg16b

Я сейчас пишу это в ассемблере, а затем связываю его. Однако мне было интересно, есть ли способ заставить компилятор сделать это для меня автоматически? например блок объемного кода с «атомарным» и выяснить, как реализовать код в качестве атомарной инструкции в базовой архитектуре процессора (или генерировать ошибку во время компиляции, если базовая арка не поддерживает его)

P.S. Я знаю, что у gcc есть некоторые встроенные модули (по крайней мере, для CAS)

http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Atomic-Builtins.html#Atomic-Builtins

Ответы [ 2 ]

12 голосов
/ 31 мая 2009

Уже вроде ответил здесь .

Стандарт C ++ 0x предоставит некоторые атомарные типы данных , в основном целочисленные и пустые типы с использованием шаблона std :: atomic <> В этой статье упоминается проект Бома по atomic_ops , который вы можете загрузить и использовать сегодня.

Если нет, разве вы не можете встроить свой ассемблер в компилятор? Я знаю, что MSVC имеет ключевое слово __ asm для встроенных подпрограмм на ассемблере. Google говорит да , gcc может сделать это тоже .

6 голосов
/ 31 мая 2009

Будущий стандарт "C ++ 0x" для C ++ будет поддерживать атомарные операции & c - см., Например, http://www.open -std.org / JTC1 / sc22 / wg21 / docs / paper / 2007 / n2427.html для обсуждения в разумных пределах. Конечно, до тех пор, пока не будет утвержден и широко реализован будущий стандарт, нет способа "переносить" такую ​​функциональность между компиляторами; если вы заинтересованы в конкретных компиляторах помимо gcc, возможно, вы можете открыть еще один вопрос именно о них.

...