文章目录
- atomic概念
- atomic实例
- 分析
atomic概念
std::atomic 是 C++ 中的一个类模板,用于提供原子操作的类型。它是为了在多线程环境下进行并发操作时保证数据的原子性而设计的。
原子操作是指不会被中断的操作,它们要么完全执行成功,要么完全不执行。在多线程环境下,如果多个线程同时访问和修改同一块内存区域,可能会导致不确定的结果或数据竞争问题。std::atomic 提供了一种可靠的机制来避免这些问题。
std::atomic 可以包装基本类型(如整型、浮点型)和用户自定义类型,使其具备原子操作的特性。使用 std::atomic 声明的变量可以通过成员函数调用来进行原子操作,如加载(load)、存储(store)、交换(exchange)、比较与交换(compare_exchange_weak/compare_exchange_strong)等。
使用 std::atomic 可以有效地确保对共享数据的正确性和一致性,避免数据竞争和并发问题,提供了一种可靠的方式来处理多线程环境下的并发操作。然而,需要注意的是,并非所有的操作都可以被原子化,某些复杂的操作可能需要其他同步机制来保证数据的一致性。
atomic实例
#include <iostream>
#include <thread>
#include <atomic>std::atomic<int> counter(0);void incrementCounter() {for (int i = 0; i < 100000; ++i) {counter.fetch_add(1);}
}int main() {std::thread t1(incrementCounter);std::thread t2(incrementCounter);t1.join();t2.join();std::cout << "Counter value: " << counter << std::endl;return 0;
}
分析
在这个例子中,我们定义了一个全局的 std::atomic 类型的变量 counter,并初始化为0。然后创建两个线程 t1 和 t2,它们都会调用 incrementCounter 函数。
incrementCounter 函数中,使用原子操作 fetch_add 来递增 counter 变量的值。fetch_add 是一个原子操作,它会将 counter 的旧值加上给定的参数,并返回旧值。这样就确保了多个线程同时进行递增操作时不会发生竞争条件。
在 main 函数中,我们启动了两个线程来执行 incrementCounter 函数,然后等待两个线程执行完毕。最后输出 counter 的值,我们可以看到输出的结果应该是 200000,因为每个线程会递增 counter 100000 次。
这个例子展示了如何使用 std::atomic 来实现线程安全的原子操作,确保多个线程对共享变量的访问和修改是同步的,避免了数据竞争问题。