Легко установить барьеры памяти на стороне ядра: макросы mb, wmb, rmb и т.д. всегда находятся на месте благодаря заголовкам ядра Linux.
Как это сделать на стороне пользователя?
Легко установить барьеры памяти на стороне ядра: макросы mb, wmb, rmb и т.д. всегда находятся на месте благодаря заголовкам ядра Linux.
Как это сделать на стороне пользователя?
Posix определяет ряд функций как действующие как барьеры памяти. Нельзя одновременно обращаться к местам памяти; чтобы предотвратить это, используйте синхронизацию - и эта синхронизация также будет работать как барьер.
Вы ищете полный барьер памяти атомные встроенные gcc.
Обратите внимание, что в приведенной здесь ссылке указано, что
[следующие] встроенные функции предназначены для совместимости с функциями, описанными в разделе "Бинарный интерфейс для конкретных процессоров Intel Itanium", раздел 7.4. Таким образом, они отходят от обычной практики GCC с использованием префикса "__builtin_" и, кроме того, что они перегружены, так что они работают на нескольких типах.
Использовать libatomic_ops. http://www.hpl.hp.com/research/linux/atomic_ops/
Это не специфичный для компилятора, и менее глючный, чем материал GCC. Это не гиганто-библиотека, которая предоставляет тонны функциональности, которые вам не нужны. Он просто обеспечивает атомарные операции. Кроме того, он переносится на разные архитектуры процессора.
Linux x64 означает, что вы можете использовать инструкции по защите памяти Intel. Вы можете обернуть их в макросы, похожие на те, что указаны в заголовках Linux, если эти макросы не подходят или доступны для вашего кода.
__sync_synchronize()
в GCC 4.4 +
Белая книга по заказу на память Intel, раздел из тома 3А руководства Intel 64 и IA-32 http://developer.intel.com/Assets/PDF/manual/253668.pdf
Библиотека профилирования Qprof (не связанная с Qt) также включает в свой исходный код библиотеку атомных операций, включая барьеры памяти. Они работают на многих компиляторах и архитектурах. Я использую его по моему проекту.
Просто заимствуя барьеры, определенные для ядра Linux, просто добавьте эти макросы в свой файл заголовка: http://lxr.linux.no/#linux+v3.6.5/arch/x86/include/asm/barrier.h#L21. И, конечно же, дать разработчикам Linux кредит в вашем исходном коде.
В заголовках include/arch/qatomic_*.h
недавнего дистрибутива Qt включен (LGPL) код для множества архитектур и всех видов барьеров памяти (приобретать, выпускать, оба).