Выражения в атомарных операторах gcc - PullRequest
1 голос
/ 23 ноября 2010

Любой знает, что делает gcc с выражениями, переданными в качестве значения для атомарных встроенных функций.Рассмотрим функцию ниже.Будет ли gcc гарантировать атомарность этой операции?(хотя для вычисления 2 << nr?

static inline test_and_set_bit(volatile void *addr, int nr, int set) {
    __sync_fetch_and_or(addr, set ? 2 << nr : 0);
}

требуются дополнительные циклы * Спасибо!

Ответы [ 2 ]

2 голосов
/ 23 ноября 2010

Выражение set ? 2 << nr : 0 должно быть оценено до начала операции __sync_fetch_and_or(). Таким образом, выборка и / или доступ к addr будут атомарными - без проблем.

Просто чтобы прояснить: действия чтения / изменения / записи в памяти, на которые указывает addr, будут выполняться атомарно - оценка значения, которое нужно или вводить, не будет атомарной (но это не нужно быть).

1 голос
/ 23 ноября 2010

Ваша функция будет эквивалентна этой функции (они, вероятно, даже скомпилируются с точно таким же кодом):

static inline test_and_set_bit(volatile void *addr, int nr, int set) {
    const int bit = set ? 2 << nr : 0;
    __sync_fetch_and_or(addr, bit);
}

Выражение не будет оцениваться «атомарно», но поскольку оно включает все локальные переменныеэто не актуально.__sync_fetch_and_or будет выполнено атомарно.Возможно, вы захотите изменить свою функцию, чтобы она выглядела так, чтобы люди, пришедшие за вами, не запутались.

...