跳至主要內容

54.C++线程同步_原子操作

约 314 字大约 1 分钟

std::atomic 常见操作

方法	                                    功能
fetch_add(x)	                    原子加 x(返回旧值)
fetch_sub(x)	                    原子减 x(返回旧值)
store(x)	                        设置值 x
load()	                            读取当前值
exchange(x)	                        交换值(返回旧值)
compare_exchange_strong(old, new)	如果值是 old,就更新为 new

原子变量 std::atomic

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

std::atomic<int> counter(0); // 线程安全的计数器

void worker() {
    for (int i = 0; i < 100000; ++i) {
        counter++; // 原子操作,自增
        // count.fetch_add(1);  // 等价于 ++count,原子加
    }
}

int main() {
    std::thread t1(worker);
    std::thread t2(worker);

    t1.join();
    t2.join();

    std::cout << "最终计数值:" << counter << std::endl;
    return 0;
}

exchange()(原子交换值)

std::atomic<int> value(10);

void worker() {
    int old = value.exchange(20);  // 将值改为 20,并返回旧值
    std::cout << "旧值: " << old << std::endl;
}

compare_exchange_strong()(原子 CAS 操作)

std::atomic<int> value(100);

void worker() {
    int expected = 100;
    if (value.compare_exchange_strong(expected, 200)) {
        std::cout << "成功修改为 200\n";
    } else {
        std::cout << "修改失败,当前值: " << value << std::endl;
    }
}

std::atomic_flag(最轻量级的原子锁)

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

std::atomic_flag lock_flag = ATOMIC_FLAG_INIT; // 原子锁

void worker(int id) {
    while (lock_flag.test_and_set(std::memory_order_acquire)); // 轮询锁
    std::cout << "线程 " << id << " 进入临界区\n";
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    lock_flag.clear(std::memory_order_release); // 释放锁
}

int main() {
    std::thread t1(worker, 1);
    std::thread t2(worker, 2);

    t1.join();
    t2.join();
    return 0;
}