原子变量

105 阅读1分钟

C++中的原子变量是一种特殊的数据类型,用于在多线程环境中进行原子操作,从而避免竞态条件(Race Condition)和数据竞争(Data Race)的发生。原子变量的操作是不可分割的,即使在多线程环境下,也能保证操作的原子性,不会被中断。

C++11引入了<atomic>头文件,其中定义了一系列原子操作类型,主要包括:

  • std::atomic<T>:表示原子类型T的变量,可以对其进行原子操作。例如,std::atomic<int>表示原子整型变量,std::atomic<bool>表示原子布尔变量等。

  • 原子操作函数<atomic>头文件中提供了一系列原子操作函数,用于对原子变量进行操作,例如load()store()exchange()compare_exchange_weak()等。

以下是一个简单的示例,演示了如何使用std::atomic<int>来实现线程安全的计数器:

#include <iostream>
#include <thread>
#include <atomic>

std::atomic<int> counter(0); // 原子整型计数器

// 线程函数,对计数器进行递增操作
void threadFunction() {
    for (int i = 0; i < 1000000; ++i) {
        counter.fetch_add(1, std::memory_order_relaxed);
    }
}

int main() {
    // 创建多个线程并启动
    std::thread t1(threadFunction);
    std::thread t2(threadFunction);
    std::thread t3(threadFunction);

    // 等待线程执行完成
    t1.join();
    t2.join();
    t3.join();

    // 输出计数器的值
    std::cout << "Final counter value: " << counter << std::endl;

    return 0;
}

在这个示例中,我们创建了一个std::atomic<int>类型的计数器counter,并使用fetch_add()原子操作函数在多个线程中对计数器进行递增操作。这样就实现了一个线程安全的计数器,可以在多线程环境下正确地进行操作,避免了竞态条件的发生。