C++-条件变量/互斥锁/lock_guard

条件变量

  • 参考C++ Reference对于条件变量的解释和例程:
    https://en.cppreference.com/w/cpp/thread/condition_variable
  • 条件变量和互斥锁一般结合使用。因为线程处于等待状态中,一般需要查看一个全局变量或共享的变量的状态,来决定是否停止等待继续运行程序。对于此全局变量,必须要原子化的操作锁定,查看状态、结束等待才有意义。
    (不加锁全局变量被其他线程随便乱改,代码就运行混乱了。原子化就是加锁解锁和wait唤醒是原子化同时进行的。)
  • std::condition_variable cv
{
    std::lock_guard lk(mtx);
    while ( condition )
        cv.wait(lk, [] {return ready;});
}

// lk是lock_guard,可以在作用范围内管理mtx,构造产生时加锁,析构删除时解锁。
// cv.wait需要传入lk,以及一个函数。这里为了简单用了匿名函数。

  • 上面代码在加锁后,进入判断条件,条件成立,就进入wait状态并解锁,交出mtx的使用权。
  • 在接收到notify信号后,加锁,并判断while条件。如果不满足条件了,跳出while,此时正好lk到了生命周期末尾,解锁。
    如果仍满足条件,while内的wait仍然会执行,wait等待并解锁。

lock_guard

上面讲了lock_guard就是用来管理mtx的。unique_lock是一种更强大,功能更多的lock_guard。

互斥锁

如果代码里已经有互斥锁,现在要添加条件变量,就需要将lock_guard与mtx整合,将lock()与unlock()以lock_guard的作用域来表示,其中条件判断就采用while循环,这样反而会简化代码的结构,更加清晰。

posted @ 2023-05-29 15:44  sparkFY  阅读(287)  评论(0编辑  收藏  举报