同步机制:互斥锁、读写锁、信号量锁、条件变量

当两个或多个并发线程的执行次序错乱,造成了意想不到的错误结果时,“竞争”就会产生。防止“竞争”的一个方法是使用同步机制,对访问“共享资源”的代码中关键段实施“并行访问”控制。常用的OS同步机制有:互斥体(mutex)、“多读取者/单写入者”锁(reader/writer locks)、信号量(semaphores)和条件变量(condition variable)。

操作方法

  • 01

    1.互斥体(mutex,Mutual Exclusion)锁当共享资源被多个线程并发访问时,为了确保这些资源的完整性,我们可以使用互斥体(mutex)锁。互斥体可用来串行执行多个线程,这需要在代码中确定临界区 (critical section)——即,一次只能由一个线程执行的代码。“互斥体”语义像双括号那样具有“对称体”:也就是就说,如果一个线程拥有互斥体,那么,它还和负责释放这个互斥体。这种简单的语义有助于互斥体的高效实现——如通过硬件自旋锁(spinlock)来实现。

  • 02

    常见的互斥体有两种:非递归互斥体(nonrecursive mutex):如果当前拥有互斥体的线程在没有首先释放它的情况,试图再次获得它,就会导致死锁或失败。递归互斥体(recursive mutex):拥有互斥体的线程可能多次获得它而不会产生自死锁,只要这个线程最终以相同次数释放这个互斥体即可。

  • 03

    2.读写锁Readers/Writer(多读取者/单写入者)锁可以通过以下方式之一访问共享资源:(1)多个线程并发读取资源,但不修改它;(2)一次只一个线程修改资源,此时其它线程都不能对其进行读/写访问。Readers/Writer锁可以用来保护“读操作比写操作频繁”的资源,从而提高并发应用程序的性能。在实现Readers/Writer锁时,要么给“读取者”以优先权,要么给“写入者”以优先权。Readers/Writer 锁和互斥体有某些共性,例如:获得锁的线程也必须释放这个锁,如查一个“写入者”希望获得这个锁,那么,这个线程必须等待其它所有“拥有这个锁”的线程释放它;然后,这个“写入者”线程单独占有这个锁。便但和互斥体不同的是,多个线程可以同时获得一个Readers/Writer锁执行“读”操作。

  • 04

    3.信号量锁从概念上说,信号量(semaphore)是原子化(automically)递增和递减的非负整数。如果一个线程试图递减一个信号量,但这个信号量的值已经为0,则线程将会阻塞。另一个线程“发出(post)”这个信号(semaphore),使用信号量大于0之后,被阻塞的线程才会被释放。信号量维护状态信息,对信号计数值(count)和被阻塞线程的数量进行记录。它们一般是通过“休止锁(sleep lock)”来实现的;休止锁用来触发环境切换,以允许其他线程执行。和互斥体不同的是,释放信号量的线程不必是最初获得这个信号量的线程。这使得信号量适用于更广泛的执行环境,如信号处理程序或中断处理程序。

  • 05

    4.条件变量和互斥体、Readers/Writer锁、信号量锁不同,条件变量(condtion variable)提供了不同风格的同步方式。在前三种机制中,当“占有锁的线程”在关键段中执行代码时,其他线程会等待。下此相反,使用条件变量,线程可以调整和调度自己的处理过程。例如,某一数据被其他线程共享;条件变量可能使用处于等待状态,直至“涉及这个数据”的一个条件表达式达到某一状态。当一个“合作线程(cooperation thread)”显示共享数据的状态已经改变时,阻塞在条件上的线程会被唤醒;然后,被唤醒的线程重新计算它的条件表达式,如果共享数据达到预期状态,则恢复处理。再复杂的条件表达式也可以通过条件变量来等待;所以,较之前面所说的同步机制,条件变量允许更复杂的调度决策。

(0)

相关推荐

  • 信号量如何解决进程的同步和互斥问题

    信号量如何解决进程的同步和互斥问题 操作方法 01 首先是进程间的两种关系:同步和互斥.所谓同步就是把异步环境下的一组并发进程,因直接制约而互相发送消息二进行互相合作.互相等待,使得各进程按一定的速度 ...

  • windows操作系统的同步机制

    最近看了下windows核心编程,虽然是比较老的书,但是感觉还是蛮有用的,顺便复习了一些操作系统的知识,比如本文的进程同步机制 用户模式下的线程同步 线程之间需要通信: 1.需要让多个线程同时访问一个 ...

  • 微信锁怎么用 微信锁伪装停止使用教程

    微信锁怎么用?有时候并不像让好友翻看自己手机中微信信息,我们可以做点小动作让好友误以为手机中微信出现问题,下面一起来参考一下微信锁伪装停止使用教程。 微信锁怎么用 微信锁伪装停止使用教程 安装微信锁后 ...

  • 玩转Win8锁屏及退出锁频状态的技巧

    每次启动Win8的登录界面屏幕便会被一副背景的图片锁住,如果你是第一次使用到Win8系统,大都会傻傻地在干等,其实Win8可以像我们的手机操作一样,只需鼠标左键按住不放,然后轻轻的往上一拖即可进入登录 ...

  • steam如何购买锁区游戏 steam锁区游戏购买方法教程

    玩家能自己用正常方法在STEAM看到的游戏都是没有任何限制的.但是有些游戏你在steam商店看不到,或者提示没有在你所在的国家/地区上架,这就是锁区.不让你在大陆玩的意思. 锁区包括了几种情况: 限区 ...

  • 怎么设置华为手机锁屏样式、锁屏签名

    现在有很多人在使用华为手机,有些新用户不知道怎么设置锁屏样式.锁屏签名,接下来小编就给大家介绍一下具体的操作步骤.具体如下:1. 首先第一步根据下图箭头所指,找到并点击[设置]图标.2. 第二步进入[ ...

  • 怎么修改华为手机锁屏样式、锁屏签名

    现在有很多人在使用华为手机,有些新用户不知道怎么修改锁屏样式.锁屏签名,接下来小编就给大家介绍一下具体的操作步骤.具体如下:1. 首先第一步根据下图所示,找到并点击[设置]图标.2. 第二步进入[设置 ...

  • Win10怎么设置锁屏壁纸,Win10锁屏壁纸怎么更换?

    WIN10和WIN8一样是可以自定锁屏壁纸的,操作方法也是大同小异.就是前面有一点不一样后面都是一样的过程.有需要的朋友请看我下面演示一下Win10怎么设置锁屏壁纸,Win10锁屏壁纸怎么更换? 操作 ...

  • 微锁屏怎么设置锁屏密码

    微锁屏怎么设置锁屏密码呢?今天小编为大家讲解一下. 操作方法 01 打开手机,找到微锁屏,点击并进入,如图所示. 02 进入之后,选择"工具",进入下一页面,如图所示. 03 进入 ...