我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++线程中有几类锁

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++线程中有几类锁

这篇文章主要讲解了“C++线程中有几类锁”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++线程中有几类锁”吧!

C++线程中的几类锁

多线程中的锁主要有五类:互斥锁条件锁自旋锁读写锁递归锁。一般而言,所得功能与性能成反比。而且我们一般不使用递归锁(C++提供std::recursive_mutex),这里不做介绍。

互斥锁

==互斥锁用于控制多个线程对它们之间共享资源互斥访问的一个信号量。==也就是说为了避免多个线程在某一时刻同时操作一个共享资源,例如一个全局变量,任何一个线程都要使用初始锁互斥地访问,以避免多个线程同时访问发生错乱。

在某一时刻只有一个线程可以获得互斥锁,在释放互斥锁之前其它线程都不能获得互斥锁,以阻塞的状态在一个等待队列中等待。

头文件:#include

类型:std::std::mutex、std::lock_guard

用法:在C++中,通过构造std::mutex的实例创建互斥单元,调用成员函数lock()来锁定共享资源,调用unlock()来解锁。不过一般不使用这种解决方案,更多的是使用C++标准库中的std::lock_guard类模板,实现了一个互斥量包装程序,提供了一种方便的RAII风格的机制在作用域块中。

示例代码:

#include <iostream>#include <thread>//C++11线程库是跨平台的#include <mutex>//C++互斥锁#include <vector>#include <windows.h>int g_num = 0;std::mutex g_mutex;void ThreadFunc(int a){cout << "启动线程:" << a << endl;for (int i = 0; i < 1000000; i++){//g_mutex.lock();std::lock_guard<std::mutex> m(g_mutex);//互斥量包装程序g_num++;//g_mutex.unlock();}}int main(){for (int i = 0; i < 4; i++){std::thread t(ThreadFunc, i);t.detach();}Sleep(2000);cout << "g_num:" << g_num << endl;return 0;}//高阶版,将上述main()函数的函数名更改,再更改以下的mainTest()即可执行。两个方法的执行的结果相同,原理也相同。int mainTest(){std::vector<std::thread *> ts;for (int i = 0; i < 4; i++){std::thread *t = new std::thread(ThreadFunc, i);//t.detach();ts.push_back(t);}for (auto begin = ts.begin(); begin != ts.end(); begin++)(*begin)->join();Sleep(2000);cout << "g_num:" << g_num << endl;return 0;}

C++线程中有几类锁

TIPS:注意std::cout和std::end都是线程不安全的,所以才会出现线程1和线程3在一行,原因就是线程1未执行cout<<endl。CPU的时间片就已经用完了,CPU转移执行线程3后,再执行线程1的cout<<endl。

条件锁

条件锁就是所谓的条件变量,当某一个线程因为某个条件未满足时可以使用条件变量使该程序处于阻塞状态,一旦条件满足则以“信号量”的方式唤醒一个因为该条件而被阻塞的线程。最为常见的就是再线程池中,初始情况下因为没有任务使得任务队列为空,此时线程池中的线程因为“任务队列为空”这个条件处于阻塞状态。一旦有任务进来,就会以信号量的方式唤醒该线程来处理这个任务。

自旋锁

互斥锁和条件锁都是比较常见的锁,比较容易理解。接下来用互斥锁和自旋锁的原理相互比较,来理解自旋锁。

假设我们有一台计算机,该计算机拥有两个处理器core1和core2.现在在这台计算机上运行两个线程:T1和T2,且T1和T2分别在处理器core1和core2上面运行,两个线程之间共享一份公共资源Public。

首先我们说明互斥锁的工作原理,互斥锁是一种sleep-waiting的锁。假设线程T1访问公共资源Public并获得互斥锁,同时在core1处理器上运行,此时线程T2也想要访问这份公共资源Public(即想要获得互斥锁),但是由于T1正在使用Public使得T2被阻塞。当T2处于阻塞状态时,T2被放入等待队列中,处理器core2会去处理其它的任务而不必一直等待(忙等)。也就是说处理器不会因为线程被阻塞而空闲,它会去处理其它事务。

然后我们说明自旋锁的工作原理,自旋锁是一种busy-waiting的锁。也就是说,如果T1正在使用Public,而T2也想使用Public,此时T2肯定是得不到这个自旋锁的。与互斥锁相反,此时运行T2的处理器core2会一直不断地循环检查Public使用可用(自旋锁请求),直到获得到这个自旋锁为止。

从“自旋锁”的名称也可以看出,如果一个线程想要获得一个被使用的自旋锁,那么它会一直占用CPU请求这个自旋锁使得CPU不能去做其它的事情,知道获取这个锁为止,这就是“自旋”的含义。当发生阻塞时,互斥锁可以让CPU去处理其它的事务,但自旋锁让CPU一直不断循环请求获取这个锁。通过比较,我们可以明显的得出结论:“自旋锁”是比较消耗CPU的。

读写锁

读写锁我们可以借助于“读者-写者”问题进行理解。接下来我们简单说下“读者-写者”问题。

计算机中某些数据被多个进程共享,对数据库的操作有两种:一种是读操作,就是从数据库中读取数据不会修改数据库中内容;另一种就是写操作,写操作会修改数据库中存放的数据。因此可以得到我们允许在数据库上同时执行多个“读”操作,但是某一时刻只能在数据库上有一个“写”操作来更新数据。这就是简单的读者-写者模型。

感谢各位的阅读,以上就是“C++线程中有几类锁”的内容了,经过本文的学习后,相信大家对C++线程中有几类锁这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++线程中有几类锁

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++线程中有几类锁

这篇文章主要讲解了“C++线程中有几类锁”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++线程中有几类锁”吧!C++线程中的几类锁多线程中的锁主要有五类:互斥锁、条件锁、自旋锁、读写锁、递
2023-06-25

java多线程加锁的方式有哪几种

在Java中,有以下几种方式实现多线程加锁:使用synchronized关键字:synchronized关键字可以修饰方法或代码块,保证同一时间只有一个线程可以执行被修饰的代码,其他线程需要等待锁释放才能执行。使用ReentrantLock
java多线程加锁的方式有哪几种
2024-02-29

C#多线程之线程锁实例分析

这篇文章主要介绍了C#多线程之线程锁实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#多线程之线程锁实例分析文章都会有所收获,下面我们一起来看看吧。一、Mutex类“mutex”是术语“互相排斥(mut
2023-06-30

java中创建线程有几种方式

线程的创建方式1、继承Thread类实现多线程2、覆写Runnable()接口实现多线程,而后同样覆写run()。推荐此方式3、使用Callable和Future创建线程相关视频教程推荐:java学习视频实例如下:1、继承Thread类实现多线程/* * 继承
java中创建线程有几种方式
2018-07-06

c#数据类型有哪几种

c# 中提供了多种数据类型,用于存储不同类型的数据,包括原始类型(整数、浮点、字符、布尔)、引用类型(类、数组)和特殊类型(dynamic、object)。选择数据类型时应考虑数据范围、精度、性能和可读性。数据类型转换可以通过显式或隐式转换
c#数据类型有哪几种
2024-04-04

java中断线程有哪几种方式

本篇内容主要讲解“java中断线程有哪几种方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中断线程有哪几种方式”吧!中断  中断(Interrupt)一个线程意味着在该线程完成任务之前
2023-06-25

java中线程的状态有哪几种

在Java中,线程有以下几种状态:1. 新建(New):线程对象被创建,但还没有调用start()方法启动线程。2. 运行(Runnable):线程被调度并执行。3. 阻塞(Blocked):线程被阻塞,等待某个条件的满足,例如等待输入/输
2023-08-15

C#多线程中的互斥锁Mutex怎么用

本篇内容主要讲解“C#多线程中的互斥锁Mutex怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#多线程中的互斥锁Mutex怎么用”吧!一、简介Mutex的突出特点是可以跨应用程序域边界对
2023-06-30

Java多线程编程中的锁有什么用

这篇文章主要讲解了“Java多线程编程中的锁有什么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java多线程编程中的锁有什么用”吧!阅读目录一、尽量不要锁住方法二、缩小同步代码块,只锁数
2023-06-17

java线程有几种状态

线程是一个动态执行的过程,它有一个从产生到死亡的过程,共五种状态:新建(new Thread) (推荐学习:java课程)当创建Thread类的一个实例(对象)时,此线程进入新建状态(未
java线程有几种状态
2017-02-03

C#中怎么定义一个线程类

本篇文章为大家展示了C#中怎么定义一个线程类,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C#线程类的定义实例://C#线程类的定义实例 using System; using System.C
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录