change_bit(0, &word); /* атомарно изменяется значение бита 1,
теперь он очищен */
/* атомарно устанавливается бит нуль и возвращается предыдущее
значение этого бита (нуль) */
if (test_and_set_bit(0, &word)) {
/* условие никогда не выполнится ... */
}
Список стандартных атомарных битовых операций приведен в табл. 9.2.
Таблица 9.2. Список стандартных атомарных битовых операций
Атомарная битовая операция | Описание |
---|---|
void set_bit(int nr, void *addr) | Атомарно установить nr -й бит в области памяти, которая начинается с адреса addr |
void clear_bit(int nr, void *addr) | Атомарно очистить nr -й бит в области памяти, которая начинается с адреса addr |
void change_bit(int nr, void *addr) | Атомарно изменить значение nr -го бита в области памяти, которая начинается с адреса addr , на инвертированное |
int test_and_set_bit(int nr, void *addr) | Атомарно установить значение nr -го бита в области памяти, которая начинается с адреса addr , и возвратить предыдущее значение этого бита |
int test_and_clear_bit(int nr, void *addr) | Атомарно очистить значение nr -го бита в области памяти, которая начинается с адреса addr , и возвратить предыдущее значение этого бита |
int test_and_change_bit(int nr, void *addr) | Атомарно изменить значение nr -го бита в области памяти, которая начинается с адреса addr , на инвертированное и возвратить предыдущее значение этого бита |
int test_bit(int nr, void *addr) | Атомарно возвратить значение nr -го бита в области памяти, которая начинается с адреса addr |
Для удобства работы также предоставляются неатомарные версии всех битовых операций. Эти операции работают так же, как и их атомарные аналоги, но они не гарантируют атомарности выполнения операций, и имена этих функций начинаются с двух символов подчеркивания. Например, неатомарная форма функции test_bit()
будет иметь имя __test_bit()
. Если нет необходимости в том, чтобы операции были атомарными, например, когда данные уже защищены с помощью блокировки, неатомарные операции могут выполняться быстрее.