【多线程】临界区,互斥量,信号量,条件变量,事件以及区别

您所在的位置:网站首页 互斥信号量和资源信号量的理解 【多线程】临界区,互斥量,信号量,条件变量,事件以及区别

【多线程】临界区,互斥量,信号量,条件变量,事件以及区别

2023-08-29 10:14| 来源: 网络整理| 查看: 265

目录

互斥量(互斥锁)和信号量(PV)

信号和信号量

信号量与条件变量

临界区与互斥量

总结

Linux和windows临界区

互斥量(互斥锁)和信号量(PV)

多任务间同步的方式包括关中断,调度器上锁, 互斥量(mutex),信号量,消息队列几种, 其中互斥量和信号量使用使用方式相近,连概念和实现都有些近似, 所以没有扎实操作系统背景知识的同学常常分不清出他们的区别,容易混淆, 下面简单分析以下.

1.互斥量(简化的信号量,只有两种状态:0和1,有所有者的概念)----资源冲突

互斥量其实可以理解为一个简化的信号量,它只有两种状态:0和1,互相斥量是管理临界资源的一种有效手段, 因为互斥量是独占的, 所以在一个时刻只允许一个线程占有互斥量,利用这个性质来实现共享资源的互斥量保护,任何时刻只允许一个线程获得互斥量对象,未能够获得互斥量对象的线程被挂起在该互斥量的等待线程队列上,这一点和1资源信号量是相同的, 但互斥量有所有者的概念,高优先级的任务可以在获取互斥量时通过对比所有者的优先级是否高于自己来决定是否提升所有者的优先级。  所以互斥量可以有效对付优先级反转的问题。

互斥锁都是二元,信号量可以是多元(表示资源数,比如队列中每增加一个成员,信号量加1,表示队列可取成员数+1,即PV操作)

2.信号量(不能解决优先级反转问题)----线程调度

 信号量是用来解决线程同步和互斥的通用工具, 和互斥量类似, 信号量也可以用作于资源互斥访问, 但信号量没有所有者的概念,在应用上比互斥量更广泛,信号量比较简单, 不能解决优先级反转问题,但信号量是一种轻量级的对象,比互斥量小巧,灵活,因此在很多对互斥要求不严格的的系统中,经常使用信号量来管理互斥资源。

小结:

信号量不一定是锁定某一个资源,而是流程上的概念,而线程互斥量则是“锁住某一资源”的概念,在锁定期间内,其他线程无法对被保护的数据进行操作。在有些情况下两者可以互换。

mutex干的活儿和semaphore干的活儿不要混起来。

在这里,我模拟一个最典型的使用semaphore的场景:a源自一个线程,b源自另一个线程,计算c = a + b也是一个线程。(即一共三个线程)显然,第三个线程必须等第一、二个线程执行完毕它才能执行。在这个时候,我们就需要调度线程了:让第一、二个线程执行完毕后,再执行第三个线程。此时,就需要用semaphore了。

int a, b, c; void geta() { a = calculatea(); semaphore_increase(); } void getb() { b = calculateb(); semaphore_increase(); } void getc() { semaphore_decrease(); semaphore_decrease(); c = a + b; } t1 = thread_create(geta); t2 = thread_create(getb); t3 = thread_create(getc); thread_join(t3); // semaphore的机制我在这里就不讲了,百度一下你就知道。 // semaphore_increase对应sem_post // semaphore_decrease对应sem_wait

简而言之,锁是服务于共享资源的;而semaphore是服务于多个线程间的执行的逻辑顺序的。 作者:MononokeHime



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3