• std::mutex


    C++11中新增了<mutex>,Mutex互斥量, 它是C++标准程序库中的一个头文件。

    std::mutex不支持copy和move操作,最初的std::mutex对象是处于unlocked状态。
    Mutex 系列类(四种)
        std::mutex,最基本的 Mutex 类。
        std::recursive_mutex,递归 Mutex 类。
        std::time_mutex,定时 Mutex 类。
        std::recursive_timed_mutex,定时递归 Mutex 类。
    Lock 类(两种)
        std::lock_guard,与 Mutex RAII 相关,方便线程对互斥量上锁。
        std::unique_lock,与 Mutex RAII 相关,方便线程对互斥量上锁,但提供了更好的上锁和解锁控制。
    其他类型
        std::once_flag
        std::adopt_lock_t
        std::defer_lock_t
        std::try_to_lock_t
    1、lock函数:互斥锁被锁定。线程申请该互斥锁,如果未能获得该互斥锁,则调用线程将阻塞(block)在该互斥锁上;
    如果成功获得该互诉锁,该线程一直拥有该互斥锁直到调用unlock解锁;
    如果该互斥锁已经被当前调用线程锁住,则产生死锁(deadlock)。
    2、unlock函数:解锁,释放调用线程对该互斥锁的所有权。
    3、try_lock:尝试锁定互斥锁。 如果互斥锁被其他线程占有,则当前调用线程也不会被阻塞,而是由该函数调用返回false; 如果该互斥锁已经被当前调用线程锁住,则会产生死锁。
    std::mutex 的成员函数
    1、构造函数,std::mutex不允许拷贝构造,也不允许 move 拷贝,最初产生的 mutex 对象是处于 unlocked 状态的。
    
    2lock(),调用线程将锁住该互斥量。线程调用该函数会发生下面 3 种情况:
    a-如果该互斥量当前没有被锁住,则调用线程将该互斥量锁住,直到调用 unlock之前,该线程一直拥有该锁。
    b-如果当前互斥量被其他线程锁住,则当前的调用线程被阻塞住。
    c-如果当前互斥量被当前调用线程锁住,则会产生死锁 (deadlock) 。
    3、unlock(),解锁,释放对互斥量的所有权。
    4、try_lock(),尝试锁住互斥量,如果互斥量被其他线程占有,则当前线程也不会被阻塞。线程调用该函数也会出现下面 3 种情况: a-如果当前互斥量没有被其他线程占有,则该线程锁住互斥量,直到该线程调用 unlock 释放互斥量。 b-如果当前互斥量被其他线程锁住,则当前调用线程返回 false,而并不会被阻塞掉。 c-如果当前互斥量被当前调用线程锁住,则会产生死锁 (deadlock) 。

    5、std::call_once,如果多个线程需要同时调用某个函数,call_once 可以保证多个线程对该函数只调用一次。
  • 相关阅读:
    《痞子衡嵌入式半月刊》 第 51 期
    痞子衡嵌入式:IAR环境下无法直接下载调试i.MXRT分散链接工程的解决方案(宏文件.mac+双Flashloader)
    《痞子衡嵌入式半月刊》 第 52 期
    消息中间件RabbitMq相关概念及原理介绍【图文并茂】
    简简单单用一下 Hbase
    WxJava for Solon 咱也不知道为啥要写
    Solon 1.6.34 发布,更现代感的应用开发框架
    Water 2.5.6 发布,一站式服务治理平台
    Water 2.5.8 发布,一站式服务治理平台
    CODING 公开课火热报名中!
  • 原文地址:https://www.cnblogs.com/osbreak/p/10092554.html
Copyright © 2020-2023  润新知