Boost.Atomicпредставляет собой библиотеку, которая предоставляет<atomic
>типы данных и операции на этих типах данных, а также ограничения упорядочивания памяти, необходимые для координации нескольких потоков через атомные переменные. Он реализует интерфейс, определенный стандартом C++11, но делает эту функцию доступной для платформ, не имеющих поддержки системы / компилятора для этой конкретной функции C++11.
Пользователи этой библиотеки уже должны быть знакомы с параллелизмом в целом, а также элементарными понятиями, такими как «взаимное исключение».
Реализация использует инструкции для конкретных процессоров, где это возможно (через встроенный ассемблер, библиотеки платформ или внутренние компоненты компилятора), и возвращается к «эмуляции» атомных операций через блокировку.
Операции с «обычными» переменными не являются атомными. Это означает, что с<int n=0
>изначально, две нити одновременно выполняются.
void function()
{
n ++;
}
В результате<n==1
>вместо 2: каждый поток будет считывать старое значение в регистр процессора, увеличивать его и записывать результат обратно. Поэтому обе нити могут писать<1
>, не зная, что другая нить делает то же самое.
Объявляя<atomic<int> n=0
>вместо этого, одна и та же операция на этой переменной всегда приводит к<n==2
>, поскольку каждая операция на этой переменной являетсяатомной.: Это означает, что каждая операция ведет себя так, как если бы она была строго последовательной по отношению к другой.
Атомные переменные полезны для двух целей:
- как средство для координации нескольких потоков с помощью пользовательских протоколов координации
- Более быстрые альтернативы «закрытому» доступу к простым переменным
Взгляните напримерыраздела для общих шаблонов.