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;
}