信号量与互斥锁区别

信号量与互斥锁之间的区别:

互斥量用于线程的互斥,信号线用于线程的同步。  
这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。  
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源

信号量经典举例

题目描述:白子和黑子各有32个,黑子先行,怎样设置信号量,才能黑子先行,且是交替下子

解答:

信号量:

白子可下吗? s1 = 0

黑子可下吗? s2 = 1

白                                             黑

for(i=0;i<32;i++){                   for(i=0;i<32;i++){

取子                                          取子

P(s1)                                        P(s2)

放白子                                       放黑子

V(s2)                                        V(s1)

}                                              }

 注意:正是因为设置了两个信号量s2与s1,才实现了黑子先行的策略,因为一开始s2=1,s1=0,而黑子首先判断的是s2,所以这个时候黑子可以走了,而白字判断的是S1,这个时候s1=0,所以,白字需要等待。黑子下完以后,讲s1置为1,这个时候白字才能走,很巧妙。

越狱》寄信

题目描述:T-boy给brad送信,Mike给Lincon送信,但他们送信收信都通过同一个树洞。

信号量:

Lincon: 是否有Mike的信,s1 = 0

Brad:    是否有T-boy的信,s2 = 0

Mike和T-boy: 树洞是否为空,s3 = 1

Mike:                    T-boy:                 Lincon:                 Brad:

write()                  write()                P(s1)                    P(s2)

P(s3)                    P(s3)                  getit()                   getit()

putit()                   putit()                 V(s3)                   V(s3)

V(s1)                     V(s2)                 readit()                 readit()

题目描述:四个人进行接力赛跑,要求使用信号量的方法使得跑的顺序是P1->P2->P3->P4

解答:

信号量:

s2:2号接棒 0

s3:3号接棒 0

s4:4号接棒 0

P1                P2                 P3                       P4

P(s2)             P(s3)                   P(s4)

run             run                 run                      run

V(s2)          V(s3)             V(s4)

原文地址:https://www.cnblogs.com/gczr/p/8376087.html

时间: 2024-10-29 04:49:29

信号量与互斥锁区别的相关文章

二值信号量和互斥锁到底有什么区别?

在说明之前我先抛出结论:互斥锁和二值信号量在使用上非常相似,但是互斥锁解决了优先级翻转的问题 假定我们现在有三个任务,task1,task2,task3,任务优先级task1最高,然后依次降低.我们知道在系统调度的时候当两个任务同时处于就绪态的时候,系统会优先执行优先级高的任务 好了,让我们来看两个案例 优先级翻转分析(使用信号量) 在例子中,我们使用pend()函数来表示获取信号量,用post()函数来表示释放信号量 如上图所示,过程分下面几步 1.一开始task3开始运行,先获取到信号量 2

信号量与互斥锁的区别

之前遇到一个问题,信号量和互斥锁的区别是什么.一时忘了思考,今天才想到这个问题,翻阅知乎和stackoverflow,理解了之后做简单整理 一.定义 mutex,互斥锁,用于序列化对一部分可重入代码的访问,这些代码不能由多个线程同时执行 semaphore,信号量,将共享资源的并发用户数限制为最大数量 二.使用 Mutex:假设我们有关键部分线程T1想要访问它然后它遵循以下步骤: 锁 使用关键部分 开锁 二进制信号量:它基于信令等待和信号工作.等待(s)将"s"值减少一个通常"

信号量与互斥锁

信号量与普通整型变量的区别: ①信号量(semaphore)是非负整型变量,除了初始化之外,它只能通过两个标准原子操作:wait(semap) , signal(semap) ; 来进行访问: ②操作也被成为PV原语(P来源于Dutch proberen"测试",V来源于Dutch verhogen"增加"),而普通整型变量则可以在任何语句块中被访问: 信号量与互斥锁之间的区别: 1. 互斥量用于线程的互斥,信号线用于线程的同步. 这是互斥量和信号量的根本区别,也就

POSIX信号量与互斥锁

POSIX信号量相关函数: sem_open sem_close sem_unlink sem_init sem_destroy sem_wait sem_post POSIX互斥锁 pthread_mutex_init pthreaad_mutex_lock pthread_mutex_unlock pthread_mutex_destroy 自旋锁 自旋锁类似于互斥锁,它的性能比互斥锁更高. 自旋锁与互斥锁很重要的一个区别在于,线程在申请自旋锁的时候,线程不会被挂起,它处于忙等待的状态. p

详解线程的信号量和互斥锁

前言:有个问题感觉一直会被问道:进程和线程的区别?也许之前我会回答: 进程:资源分配最小单位 线程:轻量级的进程 是系统调度的最小单位 由进程创建 多个线程共享进程的资源 但是现在我觉得一个比喻回答的更好:程序就像静止的火车,进程是运行的火车,线程是运行火车的每节车厢. 个人感觉理解远比背些概念性东西更好. 一.线程 通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义.线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而

条件变量、信号量、互斥锁

转载 http://blog.csdn.net/yusiguyuan/article/details/14161225 线程间的同步技术,主要以互斥锁和条件变量为主,条件变量和互斥所的配合使用可以很好的处理对于条件等待的线程间的同步问题.举个例子:当有两个变量x,y需要在多线程间同步并且学要根据他们之间的大小比较来启动不同的线程执行顺序,这便用到了条件变量这一技术.看代码 1 #include <iostream> 2 #include <pthread.h> 3 using na

编程之美--信号量与互斥锁选择(转)

编程之美--多线程高效下载的问题 2011-03-27 15:27:12 分类: C/C++ 基本的思路: 这个问题相当于是生产者和消费者模型的问题 首先定义两个线程,一个是下载线程,一个是存储线程,下载线程将数据从网络上下载到相应的数据的缓冲区中(BLOCK组成的队列).存储的线程从数据缓冲区中读取相应的数据,并将其写到相应的磁盘上去. 多线程同步的方式有:CriticalSection.Mutex和Semaphore(信号量).因为CriticalSection和Mutex,将不会使下载线程

信号量和互斥锁

信号量与互斥锁的异同: 1.信号量与互斥锁最根本的不同点在于:互斥锁的取值只能是0或者1,而信号量的取值范围则可以定义. 2.信号量的作用域可以进程也可以是线程,而互斥锁只能是线程. 简单来说互斥锁可以实现线程对于唯一资源的使用保护,而信号量则可以实现多线程或者进程间数量有限资源的使用保护.从某种意义上讲互斥锁是只能一个资源可用的信号量. 作者:CSDN链接:https://zhuanlan.zhihu.com/p/84107070来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转

信号量、互斥锁,读写锁和条件变量的区别

信号量强调的是线程(或进程)间的同步:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都 在sem_wait的时候,就阻塞在那里).当信号量为单值信号量是,也可以完成一个资源的互斥访问.有名信号量:可以用于不同进程间或多线程间的互斥与同步 创建打开有名信号量 sem_t *sem_open(const char *name, int oflag); sem_t *sem_open(const char *name, int oflag