Недавно я заглянул в реализацию ядра ядра Atom и прочитал несколько вопросов.
Сначала соответствующий код из архитектуры ia64:
typedef struct {
int counter;
} atomic_t;
#define atomic_read(v) (*(volatile int *)&(v)->counter)
#define atomic64_read(v) (*(volatile long *)&(v)->counter)
#define atomic_set(v,i) (((v)->counter) = (i))
#define atomic64_set(v,i) (((v)->counter) = (i))
-
Как для операций чтения, так и для записи, кажется, что прямой подход был сделан для чтения или записи в переменную. Если в другом месте нет другого трюка, я не понимаю, какие гарантии существуют, что эта операция будет атомарной в домене сборки. Я думаю, что очевидным ответом будет то, что такая операция переводится в один код операции сборки, но даже в этом случае, как это гарантируется при учете различных уровней кэша памяти (или других оптимизаций)?
-
В считанных макросах летучий тип используется в трюке кастинга. Кто-нибудь знает, как это влияет на атомарность здесь? (Обратите внимание, что он не используется в операции записи)