首页 > 编程语言 >C++-条件变量/互斥锁/lock_guard

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

时间:2023-05-29 15:55:05浏览次数:49  
标签:加锁 lock lk C++ 互斥 guard wait

条件变量

  • 参考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循环,这样反而会简化代码的结构,更加清晰。

标签:加锁,lock,lk,C++,互斥,guard,wait
From: https://www.cnblogs.com/sparkFY/p/17440669.html

相关文章

  • C++头文件理解
    看了下公司内部对于头文件的使用,感觉挺乱的。对于头文件容易搞混淆的点在于:涉及多文件,多次包含的时候容易搞错比如上面CPP就有三四个文件,每一个CPP都要按照先包含config,后包含common的顺序,在编译的时候指明。但是include头文件本质上就是:在编译时把指定的文件,包含到调用的地方......
  • 【重学C++】05 | 说透右值引用、移动语义、完美转发(下)
    文章首发【重学C++】05|说透右值引用、移动语义、完美转发(下)引言大家好,我是只讲技术干货的会玩code,今天是【重学C++】的第五讲,在第四讲《【重学C++】04|说透右值引用、移动语义、完美转发(上)》中,我们解释了右值和右值引用的相关概念,并介绍了C++的移动语义以及如何通过右值引......
  • C++“高级程序设计实践(C++)”课程设计任务书[2023-05-28]
    C++“高级程序设计实践(C++)”课程设计任务书[2023-05-28]“高级程序设计实践(C++)”课程设计任务书一.课程设计的目的与任务本设计是课程——《面向对象编程(C++)》的一个关键实践环节。它是根据教学计划的要求,在教师的指导下,对学生实施程序设计训练的必要过程,是对前期课堂学习内......
  • C++模板元编程:用代码生成代码的黑科技
    介绍模板元编程在C++中使用模板元编程示例一:元函数示例二:元数据计算示例三:元编程递归总结让我们开始吧。介绍模板元编程在C++编程中,元编程是一种特殊的技术,所谓的元编程就是在编写代码时,使用代码来生成代码。与传统的程序设计思路不同,元编程充分利用了C++模板的特性。采用元编程技......
  • ReentrantLock的实现原理
    ReentrantLock和synchronized都是可重入锁。ReentrantLock可以实现公平锁和非公平锁,默认非公平锁,而synchronized只能实现非公平锁。ReentrantLock基于AQS实现,Synchronized基于JVM的monitor实现。ReentrantLock还支持可中断、设置超时时间、获取等待状态。而synchronized不支持......
  • LockSupport与线程中断
    1LockSupport是什么LockSupport是用来创建锁和其他同步类的基本阻塞原语。park方法可以阻塞线程,unpark方法可以唤醒线程。与object的wait和notify不同的是,不需要synchonized的限制,没有先后顺序的限制。2线程中断线程不应该被其他线程中断,应该自己中断。线程的三个中断方法......
  • Synchronized和Lock的区别
    synchronized与Lock的主要区别如下:一、synchronized是Java的内置关键字,而Lock是接口,其常用实现类为ReentrantLock(可重入锁)和ReentrantReadWriteLock(读写锁);二、synchronized是隐式的加锁,这个流程自动化,而Lock是显式的加锁,需要手动的lock()和unlock();三、synchronized常作用于......
  • C++/R 期末冲刺3h
    C++1.基础程序#include"iostream"//C++头文件#include"stdio.h"//C头文件//usingnamespacestd;//命名空间//main()是程序开始执行的地方intmain(){std::cout<<"Hello,World!"<<"\n";return0;}C++语言定......
  • 几种同步互斥机制的异同
    同步和互斥的区别同步某些进程为完成同一任务需要分工协作,由于合作的每一个进程都是独立地以不可预知的速度推进,这就需要相互协作的进程在某些协调点上协调各自的工作。当合作进程中的一个到达协调点后,在尚未得到其伙伴进程发来的消息或信号之前应阻塞自己,直到其他合作进程发来......
  • C++ Today 02
    语法:数据类型变量名=变量初始化inta=10;数据类型存在意义:给变量分配合适的内存空间2.1整形short(短整型)2个字节int(整形)4个字节long(长整形)windows为4字节,linux为4字节(32位),8字节(64位)longlong(长长整形)8个字节#include<iostream>usingnamespacestd;intma......