首页 > 编程语言 >c++ mutex

c++ mutex

时间:2023-06-15 09:55:55浏览次数:28  
标签:std 加锁 c++ 互斥 线程 mutex 上锁

mutex 直译为 互斥量。

使用它可以做到:一份共享数据, 同时只能由一个线程访问,在此基础上会衍生很多很方便的api,通过mutex将共享数据的访问变成互斥操作,避免与时间相关的错误

简单结论及定义:

  1. 每个线程在对资源操作前都尝试先加锁,加锁成功才能操作,操作结束就解锁

   2. 当A线程对某个全局变量加锁访问,B在访问前尝试加锁,拿不到锁,B阻塞。C线程不去加锁,而直接访问该全局变量,依然能够访问(这样数据就有点混乱了)

  3.  如果一个互斥量当前没有被锁住,A线程将该互斥量锁住,解锁之前,A线程一直拥有该锁。

  4. 如果一个互斥量已经被其他线程锁住了,则当前的调用它的线程被阻塞住。

  5. 如果当前互斥量被当前调用线程锁住,则会产生死锁(deadlock)

接口:

  C++11中提供了std::mutex互斥量,共包含四种类型:

    std::mutex:最基本的mutex类。

    std::recursive_mutex:递归mutex类,能多次锁定而不死锁。

    std::time_mutex:定时mutex类,可以锁定一定的时间

    std::recursive_timed_mutex:定时递归mutex类。

  两种锁类型:

     std::lock_guard:方便线程对互斥量上锁

    std::unique_lock:方便线程对互斥量上锁,但提供了更好的上锁和解锁控制

  相关的函数:

    std::try_lock:尝试同时对多个互斥量上锁

    std::lock:可以同时对多个互斥量上锁

    std::call_once:如果多个线程需要同时调用某个函数,call_once可以保证多个线程对该函数只调用一次

 

 

  

标签:std,加锁,c++,互斥,线程,mutex,上锁
From: https://www.cnblogs.com/fxw1/p/16903825.html

相关文章

  • 新方法学C++之编程范式
    C++属于多编程范式语言:过程编程、结构化编程、面向对象编程、泛式编程、函数式编程。过程编程:类似于汇编语言结构化编程:类似C语言,把分支测试等做成了结构化面向对象编程:按解决问题的方式来编程泛式编程:解决代码可复用的问题函数式编程:类似于lisp编程语言......
  • C++ 数值最大最小标识符一网打尽,INT_MIN/ INT_MAX/LONG_MIN/LONG_MAX 等等
    ConstantMeaningValueCHAR_BIT Numberofbitsinthesmallestvariablethatisnotabitfield. 8SCHAR_MIN Minimumvalueforavariableoftypesignedchar. -128SCHAR_MAX Maximumvalueforavariableoftypesignedchar. 127UCHAR_MAX Maximumvalueforav......
  • C++面试八股文:在C++中,有哪些可执行体?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第14面:面试官:在C++中,有哪些可执行体?二师兄:可执行体?面试官:也就是可调用对象。二师兄:让我想一想。函数、函数指针、类的静态方法、类的成员方法、仿函数、lambda表达式。面试官:能说一说他们之间有什么区别吗?二师兄:好的。函数是......
  • C++类型转换详解--const_cast
    一.函数描述:const_cast<type-id>(expression)主要是用来去掉const属性,当然也可以加上const属性。主要是用前者,后者很少用。去掉const属性:const_case<int*>(&num),常用,因为不能把一个const变量直接赋给一个非const变量,必须要转换。加上const属性:constint*k=const_case......
  • C++ 深入理解const_cast转换运算符
    const_cast转换运算符我们在RTTI和类型转换运算符中详细介绍过它的用法和使用场景,今天我们对其进一步了解一下。首先我们回忆一下它的作用和用法。const_cast的基本使用const_cast运算符用于执行只有一种用途的类型转化,即改变const或volatile。用法如下:const_cast<type_name>......
  • 正确使用C++的const_cast
    C++的四种类型转换之const_cast前言引用《EffectiveC++中文版第三版》中条款27"尽量少做转型动作"中的一段话:C++规则的设计目标之一是,保证“类型错误”绝对不可能发生,理论上如果你的程序很“干净”的通过编译,就表示它并不企图在任何对象上执行任何不安全、无意义、愚蠢......
  • C++面试八股文:C++中,设计一个类要注意哪些东西?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第9面:面试官:C++中,设计一个类要注意哪些东西?二师兄:设计一个类主要考虑以下几个方面:1.面向对象的封装、继承及多态。2.bigthree或者bigfive。3.运算符和函数重载、静态成员、友元、异常处理等相关问题。面试官:请介绍一下面向......
  • 《C++》对象的初始化和清理
    不设计构造和析构函数 编译器会提供空语句的构造和析构初始化--构造函数无返回类型函数名与类名相同构造函数可以有参数可以发生重载创建对象的时候构造函数会自动调用且只调用一次classPerson{public: Person() { cout<<"无参构造函数调用"<<endl; }Person(inta......
  • C++ const_cast用法
    原文C++const_cast用法const_cast是一种C++运算符,主要是用来去除复合类型中const和volatile属性(没有真正去除)。变量本身的const属性是不能去除的,要想修改变量的值,一般是去除指针(或引用)的const属性,再进行间接修改。用法:const_cast<type>(expression)通过const_cast运算符,也只......
  • [C++/PTA] 有序数组(类模板)
    题目要求实现一个类模板,它可以接受一组数据,能对数据排序,也能输出数组的内容。每行输入的第一个数字为0,1,2或3:为0时表示输入结束;为1时表示将输入整数,为2时表示将输入有一位小数的浮点数,为3时表示输入字符。如果第一个数字非0,则接下来将输入一个正整数,表示即将输入的数据的数量......