同步机制的几种实现简介

 

互斥量(Mutex)
http://blog.csdn.net/rommi/article/details/6015143
Mutex本质上说就是一把锁,提供对资源的独占访问,所以Mutex主要的作用是用于互斥。Mutex对象的值,只有0和1两个值。这两个值也分别代表了Mutex的两种状态。值为0, 表示锁定状态,当前对象被锁定,用户进程/线程如果试图Lock临界资源,则进入排队等待;值为1,表示空闲状态,当前对象为空闲,用户进程/线程可以Lock临界资源,之后Mutex值减1变为0。


屏障(barrier)
http://www.cnblogs.com/yuuyuu/p/5152560.html
屏障跟条件变量一样,是用来协同多线程一起工作!!!
条件变量是多线程间传递状态的改变来达到协同工作的效果。屏障是多线程各自做自己的工作,如果某一线程完成了工作,就等待在屏障那里,直到其他线程的工作都完成了,再一起做别的事。举个通俗的例子:
1.对于条件变量。在接力赛跑里,1号队员开始跑的时候,2,3,4号队员都站着不动,直到1号队员跑完一圈,把接力棒给2号队员,2号队员收到接力棒后就可以跑了,跑完再给3号队员。这里这个接力棒就相当于条件变量,条件满足后就可以由下一个队员(线程)跑。
2.对于屏障。在百米赛跑里,比赛没开始之前,每个运动员都在赛场上自由活动,有的热身,有的喝水,有的跟教练谈论。比赛快开始时,准备完毕的运动员就预备在起跑线上,如果有个运动员还没准备完(除去特殊情况),他们就一直等,直到运动员都在起跑线上,裁判喊口号后再开始跑。这里的起跑线就是屏障,做完准备工作的运动员都等在起跑线,直到其他运动员也把准备工作做完!


条件变量(Condition)
条件变量与互斥量不同,互斥量是防止多线程同时访问共享的互斥变量来保护临界区。条件变量是多线程间可以通过它来告知其他线程某个状态发生了改变,让等待在这个条件变量的线程继续执行。通俗一点来讲:设置一个条件变量让线程1等待在一个临界区的前面,当其他线程给这个变量执行通知操作时,线程1才会被唤醒,继续向下执行。
条件变量总是和互斥量一起使用,互斥量保护着条件变量,防止多个线程对条件变量产生竞争。


读写锁
读写锁与互斥量的功能类似,对临界区的共享资源进行保护!互斥量一次只让一个线程进入临界区,读写锁比它有更高的并行性。读写锁有以下特点:
1.如果一个线程用读锁锁定了临界区,那么其他线程也可以用读锁来进入临界区,这样就可以多个线程并行操作。但这个时候,如果再进行写锁加锁就会发生阻塞,写锁请求阻塞后,后面如果继续有读锁来请求,这些后来的读锁都会被阻塞!这样避免了读锁长期占用资源,防止写锁饥饿!
2.如果一个线程用写锁锁住了临界区,那么其他线程不管是读锁还是写锁都会发生阻塞!


信号量(Semaphore)
链接:https://www.zhihu.com/question/47411729/answer/105848845
信号量就是在一个叫做互斥区的门口放一个盒子,盒子里面装着固定数量的小球,每个线程过来的时候,都从盒子里面摸走一个小球,然后去互斥区里面浪(?),浪开心了出来的时候,再把小球放回盒子里。如果一个线程走过来一摸盒子,得,一个球都没了,不拿球不让进啊,那就只能站在门口等一个线程出来放回来一个球,再进去。这样由于小球的数量是固定的,那么互斥区里面的最大线程数量就是固定的,不会出现一下进去太多线程把互斥区给挤爆了的情况。这是用信号量做并发量限制。
另外一些情况下,小球是一次性的,线程拿走一个进了门,就把小球扔掉了,这样用着用着小球就没了,不过有另外一些线程(一般叫做生产者)会时不时过来往盒子里再放几个球,这样就可以有新的线程(一般叫做消费者)进去了,放一个球进一个线程,这是信号量做同步功能。你截图里的例子就是这个情况,主线程是生产者,通过sem_post往盒子里放小球(信号量加一),而其他线程是消费者,通过sem_wait从盒子里拿小球(信号量减一),如果遇到盒子里一个小球都没有(信号量为0),就会开始等待信号量不为0,然后拿走一个小球(信号量减一)再继续。本质上来说信号量就是那个盒子,以及“摸不到球就不让进”这个机制。


互斥量和信号量的区别
1.
互斥量用于线程的互斥,信号线用于线程的同步。
这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源
2. 互斥量值只能为0/1,信号量值可以为非负整数。
也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。

 

3. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。

 

本文是对网络上面的整理,出处已在各处说明!

### 回答1: 一些实现同步机制的方式包括:使用锁、信号量、条件变量、屏障等。锁可以用于保护共享资源,信号量可以用于限制并发访问,条件变量可以用于线程之间的通信,屏障可以用于同步多个线程的执行。具体实现方式取决于具体的应用场景和需求。 ### 回答2: 实现同步机制几种方式包括:锁机制、信号量机制、条件变量机制和管程机制。 锁机制是最常见的同步机制,通过对关键资源加锁来实现同一时间只能有一个线程访问该资源。常见的锁包括互斥锁和读写锁。互斥锁用于实现互斥访问,即同一时间只能有一个线程访问该资源;读写锁则允许多个线程同时读取资源,但只允许一个线程写入资源。 信号量机制使用信号量来实现对资源的访问控制。它通过一个计数器来控制同一时间内允许访问资源的线程数量,并提供了P操作(申请访问资源)和V操作(释放资源)来实现对资源的加锁和解锁。 条件变量机制用于实现线程之间的通信和协作。它通过一个条件变量和一个互斥锁来实现线程可以在某个条件成立时等待条件变量,直到条件满足后被唤醒;同时,其他线程也可以通过发送信号来通知条件变量的等待线程条件已经满足。 管程机制是一种高级的同步机制,它将共享资源和对资源的操作封装在一个对象中,通过对象的方法来实现资源的访问控制。管程提供了条件变量和互斥锁来实现线程之间的通信和同步操作。 这些同步机制都可以用来解决多线程并发访问共享资源时可能引发的问题,例如数据竞争和死锁。不同的机制适用于不同的场景和需求,开发者需要根据实际情况选择合适的同步机制来确保程序的正确性和性能。 ### 回答3: 实现同步机制几种方式有: 1. 互斥量(Mutex):使用互斥量来保证同一时间只有一个线程执行临界区代码,通过对互斥量的加锁和解锁来控制线程的访问顺序。 2. 信号量(Semaphore):使用信号量来控制同时可访问某一资源的线程数量,通过信号量的P(wait)和V(signal)操作来进行进程间的同步。 3. 条件变量(Condition):条件变量用于在某个线程等待特定条件的发生,当条件满足时,其他线程可以唤醒等待的线程继续执行。 4. 临界区(Critical Section):临界区是指一段代码,一次只允许一个线程进入执行,通过使用互斥量或信号量来保证临界区的互斥性。 5. 事件(Event):事件用于线程间的通信和同步,一个线程等待某个事件的发生,另一个线程发生该事件后,等待的线程被唤醒继续执行。 6. 互斥量+条件变量(Mutex+Condition):通过互斥量的加锁和解锁保证临界区的互斥性,通过条件变量的等待和唤醒来控制线程的执行顺序和同步。 以上是实现同步机制几种常见方式,不同的应用场景可以选择适合的方式来实现线程间的同步和互斥操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值