C++中并发编程报错的解决策略
C++11引入的多线程支持使得并发编程变得更为便捷,但随之而来的线程安全问题、竞态条件、死锁等问题也给开发者带来了挑战。本文基于CSDN技术社区的实战经验,系统梳理C++并发编程中的常见错误及解决方案,提供可复用的代码模板和最佳实践。
一、核心并发错误与解决方案
1. 数据竞争(Data Race)
典型场景:
- 多个线程同时读写同一变量
- 未正确使用互斥锁保护共享资源
- 内存访问顺序不一致导致未定义行为
解决方案:
方案1:使用互斥锁(mutex)
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
int shared_counter = 0;
void increment_counter() {
for (int i = 0; i < 10000; ++i) {
std::lock_guard<std::mutex> lock(mtx); // 自动加锁/解锁
++shared_counter;
}
}
int main() {
std::thread t1(increment_counter);
std::thread t2(increment_counter);
t1.join();
t2.join();
std::cout << "Final counter value: " << shared_counter << std::endl; // 正确输出20000
return 0;
}
方案2:原子操作(atomic)
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> atomic_counter(0);
void increment_atomic() {
for (int i = 0; i < 10000; ++i) {
atomic_counter.fetch_add