C++ 原子类型使用
时间: 2023-07-11 21:06:41 浏览: 137
C++中的原子类型是一种线程安全的类型,它可以保证多个线程同时访问时的正确性。原子类型在并发编程中非常重要,因为多个线程同时访问同一个变量时,可能会导致竞态条件(race condition)的问题,而原子类型可以避免这种问题的发生。
在C++11标准中,提供了以下原子类型:
- std::atomic_bool
- std::atomic_char
- std::atomic_schar
- std::atomic_uchar
- std::atomic_short
- std::atomic_ushort
- std::atomic_int
- std::atomic_uint
- std::atomic_long
- std::atomic_ulong
- std::atomic_llong
- std::atomic_ullong
- std::atomic_char16_t
- std::atomic_char32_t
- std::atomic_wchar_t
- std::atomic_int_least8_t
- std::atomic_uint_least8_t
- std::atomic_int_least16_t
- std::atomic_uint_least16_t
- std::atomic_int_least32_t
- std::atomic_uint_least32_t
- std::atomic_int_least64_t
- std::atomic_uint_least64_t
- std::atomic_int_fast8_t
- std::atomic_uint_fast8_t
- std::atomic_int_fast16_t
- std::atomic_uint_fast16_t
- std::atomic_int_fast32_t
- std::atomic_uint_fast32_t
- std::atomic_int_fast64_t
- std::atomic_uint_fast64_t
- std::atomic_size_t
- std::atomic_ptrdiff_t
- std::atomic_intmax_t
- std::atomic_uintmax_t
使用原子类型时,可以通过std::atomic<>模板来定义一个原子类型的变量,例如:
```c++
std::atomic<int> my_atomic_var;
```
原子类型提供了以下操作方法:
- store:设置原子变量的值
- load:获取原子变量的值
- exchange:交换原子变量的值
- compare_exchange_strong:比较并交换原子变量的值(强保证)
- compare_exchange_weak:比较并交换原子变量的值(弱保证)
- fetch_add:原子地将原子变量的值加上指定值
- fetch_sub:原子地将原子变量的值减去指定值
- fetch_and:原子地将原子变量的值与指定值按位与
- fetch_or:原子地将原子变量的值与指定值按位或
- fetch_xor:原子地将原子变量的值与指定值按位异或
这些操作方法可以保证多个线程同时访问同一个原子变量时的正确性。例如,使用原子变量来实现一个计数器:
```c++
#include <atomic>
#include <iostream>
#include <thread>
std::atomic<int> counter(0);
void increment_counter() {
for (int i = 0; i < 100000; i++) {
counter++;
}
}
int main() {
std::thread t1(increment_counter);
std::thread t2(increment_counter);
t1.join();
t2.join();
std::cout << "Counter value: " << counter << std::endl;
return 0;
}
```
在上面的代码中,我们定义了一个原子变量counter,并使用两个线程分别对其进行了100000次自增操作。由于原子变量的自增操作是线程安全的,因此我们可以保证最终计数器的值是正确的。
阅读全文