通过合理组合这些同步机制 ,深入五大同步原语实战解析
cpp std::mutex mtx; void safeIncrement() { std::lock_guard
死锁预防技巧
:
- 遵循固定顺序上锁
- 使用std::scoped_lock(C++17)
- 设置超时机制(try_lock_for)cpp std::atomic
原子类型支持:
- 算术运算(fetchadd/sub...) - 位运算(fetchand/or/xor)
- 比较交换(compareexchangestrong/weak)cpp
std::condition_variable cv;
std::mutex mtx;
bool ready = false;// 生产者
{
std::lockguard lk(mtx); ready = true;} cv.notifyone();// 消费者
std::unique_lock lk(mtx);
cv.wait(lk, []{return ready;});虚假唤醒处理:必须使用谓词参数的wait版本
cpp
std::shared_mutex smtx;// 写线程
{
std::unique_lock lock(smtx);
// 写入操作
}// 读线程
{
std::shared_lock lock(smtx);
// 读取操作
}C++20引入的轻量级同步工具:cpp
std::counting_semaphore<10> sem(0);// 发布者
sem.release();// 接收者
sem.acquire();当多个线程同时访问共享资源且至少有一个线程进行写操作时