其他分享
首页 > 其他分享> > 同步与锁--几种锁的作用与区别

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

作者:互联网

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

最常见的手段:锁

分类:

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

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

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

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

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

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

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

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