ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

同步与锁--几种锁的作用与区别

2022-05-03 13:34:50  阅读:138  来源: 互联网

标签:同步 获取 -- 访问 几种 信号量 互斥 临界 线程


同步:指在一个线程访问数据未结束时,其他线程不得对同一数据进行访问。

最常见的手段:锁

分类:

1.二元信号量:最简单的一种锁,,只有两种状态:占用和非占用。适合只能被唯一一个线程独占访问的资源。当二元信号量处于非占用状态时,一个试图获取该二元信号量的线程会获得该锁,并将二元信号量置为占用状态,此后其他所有试图获取该信号量的线程将会等待,直到该锁被释放。

2.多元信号量:允许多个线程并发访问资源,初始值设为N的信号量允许N个线程并发访问。

线程访问资源时,首先获取信号量,进行如下操作:

  • 将信号量减1;
  • 如果信号量的值小于0,则进入等待状态,否则继续执行。访问完资源之后,线程释放信号量,进行如下操作:
  • 将信号量+1;
  • 如果信号量的值小于1,唤醒一个等待中的线程

3.互斥量:与二元信号量相似,资源仅同时允许一个线程访问。与信号量的区别是:信号量在整个系统可以被任意线程获取并释放,即同一个信号量可以被系统中的一个线程获取之后由另一个线程释放,而互斥量则要求哪个线程获取了互斥量,哪个线程就要复制释放这个锁,其他线程越俎代庖去释放互斥量是无效的

4.临界区:比互斥锁更加严格的同步手段。术语中,把临界区的锁的获取称为进入临界区,锁的释放叫离开临界区。其与互斥锁和临界区的区别在于:互斥量和信号量在系统的任何进程里都是可见的,即:一个进行创建了一个互斥量或信号量,另一个进程试图去获取该锁是合法的。但临界区的作用范围仅限于本进程,其他进程无法获取。除此之外,临界区具有与互斥量相同的性质

5.读写锁:致力于一种更加特定场合的同步。对于一段数据,多个线程同时访问时,就必须使用同步手段来避免出错,使用信号量、互斥量或者临界区尽管可以保证程序正确,但对于读取频繁而偶尔写入的情况,会显得非常低效。读写锁可以避免这个问题,读写锁具有独占式和共享式两种方式。当锁处于自由状态时,试图以任何一种方式获取均能成功,并将锁置为对应的状态,若共享状态,则其他线程可获取成功,若独占状态,那么必须等待锁被所有线程释放才能获取。

6.条件变量:作为一种同步手段,作用类似于一个栅栏。两种操作:首先线程可以等待条件变量,一个条件变量可以被多个线程等待;其次线程可以唤醒条件变量,此时某个或者所有等待此条件变量的线程都会被唤醒并继续支持。即:使用条件变量可以让许多线程一起等待某个事件的发生,当事件发生时(条件变量被唤醒)所有线程可以一起恢复执行。

标签:同步,获取,--,访问,几种,信号量,互斥,临界,线程
来源: https://www.cnblogs.com/ldwblogs/p/16218155.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有