c++并发编程实战 第四章

同步并发操作

 

本章主要内容

  • 等待事件
  • 带有期望的等待一次性事件
  • 在限定时间内等待
  • 使用同步操作简化代码

4.1 等待一个事件或其他条件

bool flag;
std::mutex m;
void wait_for_flag()
{
    std::unique_lock lk(m);
    while(!flag)
    {
        lk.unlock(); // 1 解锁互斥量
        std::this_thread::sleep_for(std::chrono::milliseconds(100));// 2 休眠100ms
        lk.lock(); // 3 再锁互斥量
    }
}

这个循环中,在休眠前②,函数对互斥量进行解锁①(解锁后,其他线程可以上锁,执行一些操作,所以另外的线程就有机会获取锁并设置标识),并且在休眠结束后再对互斥量进行上锁。

C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为。通常的做法是在修改共享数据成员的时候进行加锁--mutex。在使用锁的时候通常是在对共享数据进行修改之前进行lock操作,在写完之后再进行unlock操作,进场会出现由于疏忽导致由于lock之后在离开共享成员操作区域时忘记unlock,导致死锁。

针对以上的问题,C++11中引入了std::unique_lock与std::lock_guard两种数据结构。通过对lock和unlock进行一次薄的封装,实现自动unlock的功能。

你可能感兴趣的:(并发编程学习)