Как я могу атомарно прочитать значение QAtomicInt или QAtomicPointer в Qt4 на всех поддерживаемых архитектурах? Я не забочусь об упорядочении памяти здесь, я просто хочу быть уверен, что я не буду читать частично старое, частично новое значение, если другой поток одновременно изменяет значение.
В Qt4 эти классы имеют операторы приведения только для int или T *. Там, кажется, более новый код (http://qt.gitorious.org/qt/qtbase/blobs/master/src/corelib/thread/qbasicatomic.h), который различает неатомарную load () и атомарную loadAcquire (). Атомика C ++ 11 также имеет атомарную нагрузку () (http://en.cppreference.com/w/cpp/atomic/atomic/load). Вот почему я обеспокоен тем, что методы, предоставляемые Qt4, недостаточно безопасны.
Я знаю, что fetchAndAddRelaxed (0) должен работать, но это похоже на взлом и, вероятно, не является оптимальным с точки зрения производительности.
В основном ответ — да. Практически все современные платформы допускают как минимум 32-битные или 64-битные атомарные нагрузки / хранилища предоставлена переменные выровнены. (Атомная используется здесь в том смысле, что вы не будете загружать «частичное» значение)
Теперь документация Qt не дает понять, что их атомники обеспечивают это, используя базовые (то, что они называют смущенно неатомарными) load()
а также store()
, loadAcquire () и особенно fetchAndAddRelaxed (0) дороже того, что вам нужно — loadAcquire — самый дешевый из этих 2
На вашем месте я бы просто использовал load () и store (). Если вам нужна дополнительная гарантия в отношении документации Qt, то loadAcquire — это самый дешевый способ, а в архитектуре, такой как x86, подобен load ().
Лучшим способом было бы использование атомарного C ++ 11 с моделью расслабленной памяти, которая вам нужна.
Других решений пока нет …