std::atomic通过原子操作确保线程安全,适用于单变量无锁编程,性能高但需谨慎使用内存序;而std::mutex提供更通用的互斥保护,适合复杂操作和数据结构,易于正确使用。选择取决于场景:简单原子操作用std::atomic,复合逻辑用std::mutex。

C++中,
std::atomic
std::atomic
int i = 0; i++;
i
i
i
std::atomic
使用
std::atomic
#include <atomic>
#include <iostream>
#include <thread>
#include <vector>
std::atomic<int> counter(0); // 初始化一个原子整数
void increment_counter() {
for (int i = 0; i < 100000; ++i) {
counter++; // 原子递增操作
}
}
int main() {
std::vector<std::thread> threads;
for (int i = 0; i < 10; ++i) {
threads.emplace_back(increment_counter);
}
for (auto& t : threads) {
t.join();
}
std::cout << "Final counter value: " << counter.load() << std::endl; // 原子读取
// 预期输出:1000000
return 0;
}在这个例子中,
counter++
counter.load()
counter.store(value)
std::atomic
compare_exchange_weak
compare_exchange_strong
立即学习“C++免费学习笔记(深入)”;
这是并发编程中一个非常常见且关键的问题。
std::atomic
std::mutex
std::atomic
std::atomic
std::mutex
std::mutex
何时选择哪个?
选择 std::atomic
int
bool
std::atomic<T>::is_lock_free()
选择 std::mutex
std::atomic
std::atomic
有时候,两者甚至可以结合使用。例如,一个无锁队列可能在内部使用
std::atomic
std::mutex
std::mutex
std::atomic
std::atomic
默认情况下,
std::atomic
std::memory_order_seq_cst
然而,在许多场景下,我们并不需要如此强的保证。C++11引入了多种内存序,允许我们根据实际需求放松这些限制:
std::memory_order_relaxed
relaxed
std::memory_order_acquire
std::memory_order_release
std::memory_order_release
release
release
std::memory_order_acquire
acquire
acquire
release
release
acquire
release
release
acquire
std::atomic<bool> ready_flag(false);
int data = 0;
void producer() {
data = 42; // 非原子写入
ready_flag.store(true, std::memory_order_release); // release 操作
}
void consumer() {
while (!ready_flag.load(std::memory_order_acquire)); // acquire 操作
std::cout << "Data is: " << data << std::endl; // 保证能看到 42
}在这个例子中,
acquire-release
consumer
ready_flag
true
data
42
std::memory_order_acq_rel
acquire
release
fetch_add
compare_exchange
权衡与选择:
内存序的选择是一个微妙的平衡。
seq_cst
relaxed
acquire-release
我个人在实践中,如果对并发模型没有百分之百的把握,或者性能瓶颈并不明显,我会倾向于使用默认的
std::memory_order_seq_cst
std::atomic
常见的陷阱:
std::atomic
std::atomic<MyStruct> s;
s.load().member = 5;
s.member_function();
s.load()
MyStruct
s
s
s = new_value;
MyStruct val = s.load();
std::atomic<std::shared_ptr<T>>
seq_cst
relaxed
compare_exchange_weak
compare_exchange_strong
std::atomic
std::mutex
std::atomic
compare_exchange
最佳实践:
std::atomic
std::memory_order_seq_cst
compare_exchange
compare_exchange_weak
compare_exchange_strong
std::atomic
std::mutex
std::condition_variable
std::latch
std::barrier
总而言之,
std::atomic
以上就是C++如何使用std::atomic保证线程安全的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号