Реализация атомарных операций чтения и записи в ядре Linux

Недавно я заглянул в реализацию атомарного чтения и записи в ядре Linux, и возникло несколько вопросов.

Сначала соответствующий код из архитектуры 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))
  1. Кажется, что для операций чтения и записи был использован прямой подход для чтения или записи в переменную. Если где-то нет другого трюка, я не понимаю, какие существуют гарантии, что эта операция будет атомарной в домене сборки. Я предполагаю, что очевидным ответом будет то, что такая операция преобразуется в один код операции сборки, но даже в этом случае, как это гарантируется с учетом различных уровней кеш-памяти (или других оптимизаций)?

  2. В макросах чтения изменчивый Тип используется в трюке с кастингом. Кто-нибудь знает, как это влияет на атомарность здесь? (Обратите внимание, что он не используется в операции записи)

15
задан EdwardH 15 February 2012 в 07:06
поделиться