请教:spinlock,mutex,semaphore,critical section的作用和区别,都适合那些场合,谢谢

zxycbz 2008-03-12 08:04:31
请教:spinlock,mutex,semaphore,critical section的作用和区别,都适合那些场合,谢谢
给些资料也可以,谢谢!
...全文
3748 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
就呆在云上 2008-12-12
  • 打赏
  • 举报
回复
Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行。



Semaphore是一件可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来。对于N=1的情况,称为binary semaphore。一般的用法是,用于限制对于某一资源的同时访问。



Binary semaphore与Mutex的差异:

在有的系统中Binary semaphore与Mutex是没有差异的。在有的系统上,主要的差异是mutex一定要由获得锁的进程来释放。而semaphore可以由其它进程释放(这时的semaphore实际就是个原子的变量,大家可以加或减),因此semaphore可以用于进程间同步。Semaphore的同步功能是所有系统都支持的,而Mutex能否由其他进程释放则未定,因此建议mutex只用于保护critical section。而semaphore则用于保护某变量,或者同步。



另一个概念是spin lock,这是一个内核态概念。spin lock与semaphore的主要区别是spin lock是busy waiting,而semaphore是sleep。对于可以sleep的进程来说,busy waiting当然没有意义。对于单CPU的系统,busy waiting当然更没意义(没有CPU可以释放锁)。因此,只有多CPU的内核态非进程空间,才会用到spin lock。Linux kernel的spin lock在非SMP的情况下,只是关irq,没有别的操作,用于确保该段程序的运行不会被打断。其实也就是类似mutex的作用,串行化对critical section的访问。但是mutex不能保护中断的打断,也不能在中断处理程序中被调用。而spin lock也一般没有必要用于可以sleep的进程空间。
zhangjundriver 2008-12-12
  • 打赏
  • 举报
回复
有一次去深信服的校园招聘考过这个题啊,汗颜啊,我不会。
program2050 2008-12-12
  • 打赏
  • 举报
回复
等高人来
野男孩 2008-03-12
  • 打赏
  • 举报
回复
除了最后一个Critical Section,其他都能用于进程间同步,临界段只能用于进程内部,是轻量级同步对象。

spinlock是自旋锁,用于多cpu的情况

mutex就是普通的跨进程同步对象

semaphore用于对资源数的控制

建议看ls说的那本书
独孤过儿 2008-03-12
  • 打赏
  • 举报
回复
《Win32 多线程程序设计》

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧