【问题标题】:Difference between Mutex, Semaphore & Spin Locks互斥锁、信号量和自旋锁之间的区别
【发布时间】:2014-06-24 00:46:44
【问题描述】:

我正在用 IPC 做实验,尤其是 Mutex、Semaphore 和 Spin Lock。 我学到的是 Mutex 是用于异步锁定(带休眠(根据我在 NET 上读到的理论))机制,信号量是同步锁定(带信号和休眠)机制,而自旋锁是同步但非休眠机制。

谁能帮我深入澄清这些东西? 另一个疑问是关于互斥锁的,当我用线程和互斥锁编写程序时,当一个线程正在运行时,另一个线程未处于睡眠状态,但它不断尝试获取锁。那么 Mutex 是在休眠还是不休眠???

【问题讨论】:

标签: multithreading ipc mutex semaphore spinlock


【解决方案1】:

这里很好地解释了信号量和互斥锁的区别:

http://blog.feabhas.com/2009/09/mutex-vs-semaphores-–-part-1-semaphores/

简短的回答至少与二进制信号量的所有权有关,但我建议您阅读整篇文章。

【讨论】:

【解决方案2】:

首先,记住这些'同步对象'的目标:

这些对象旨在提供高效连贯使用' 多个线程在 1 个进程之间或来自不同进程的共享数据'

这些对象可以是'获得''释放'

就是这样!!!故事结束!!!

现在,如果对你有帮助,让我把我的一粒沙子:

1) 关键部分= 用户对象,用于允许仅执行一个活动线程来自许多其他在一个过程中。其他未选择的线程(@获取此对象)被置于睡眠

[没有进程间能力,非常原始的对象]。

2) Mutex Semaphore(又名 Mutex)= 内核对象,用于仅允许执行许多其他线程的一个活动线程在一个进程中在不同进程中。其他未选择的线程(@获取此对象)被置于睡眠。该对象支持线程所有权、线程终止通知、递归(来自同一线程的多个“获取”调用)和“避免优先级反转”。

[进程间能力,使用非常安全,一种“高级”同步对象]。

3) 计数信号量(又名信号量)= 用于允许执行一组活动线程来自许多其他线程的内核对象, 在一个进程中在不同进程中。其他未选择的线程(@获取此对象)被置于睡眠

[进程间功能但使用起来不是很安全,因为它缺少以下“互斥”属性:线程终止通知、递归?、“避免优先级反转”?等]。

4) 现在,谈论“自旋锁”,首先是一些定义:

Critical Region= 由 2 个或更多进程共享的内存区域。

Lock= 一个变量,其值允许或拒绝进入“关键区域”。 (它可以实现为一个简单的“布尔标志”)。

忙于等待= 不断测试变量,直到出现某个值。

最后:

自旋锁(又名自旋锁)= ,它使用忙等待强>。 (的获取是通过xchg或类似的原子操作 em>)。

[无线程休眠,主要仅在内核级别使用。用户级代码效率低下]。

作为最后的评论,我不确定,但我可以和你打赌,上面的前 3 个同步对象(#1、#2 和 #3)利用这个简单的野兽(#4)作为他们的实施。

祝你有美好的一天!

参考资料:

-Real-Time Concepts for Embedded Systems by Qing Li 和 Caroline Yao(CMP 书籍)。

-Andrew Tanenbaum(培生国际教育)的现代操作系统(第 3 届)。

-Jeffrey Richter(Microsoft 编程系列)的 Microsoft Windows 编程应用程序(第 4 期)。

【讨论】:

  • 关于“关键部分 .. 其他线程已进入睡眠状态。” - 仅适用于关键部分的非常原始 实现,其中中断在进入该部分时被禁用。请参阅Wikipedia - Critical section 以了解该实现的讨论,以及使用信号量来更有效地实现的替代方案,即仍然被称为代码“关键部分”的部分。
  • ...这里后面的定义更加误导,当他们说“其他线程进入睡眠状态”时。这对我来说意味着其他线程根本无法运行,这完全忽略了这些机制的重点。具体来说,任何需要使用共享资源(受这些机制之一保护)的线程确实必须被阻塞(进入睡眠状态),但不使用共享资源的线程不会进入睡眠状态.
  • ...互斥锁和信号量之间的区别是..weak .. [不知道这是引用的问题,还是这个答案中的重新陈述]。为了更清楚的区别,请参阅barrgroup.com/Embedded-Systems/How-To/RTOS-Mutex-Semaphore 关键语句“信号量的正确使用是从一个任务到另一个任务的信号量。互斥量意味着总是按顺序被使用共享的每个任务获取和释放。它保护的资源。相比之下,使用信号量的任务要么发出信号,要么等待——而不是两者兼而有之。"
  • @ToolmakerSteve,互斥量和信号量之间的区别很弱吗?真的?。拜托,我请求你从参考文献中阅读其中一本书。 Li & Yao 这本书非常适合让您的想法清晰。
  • @ToolmakerSteve,但是我应该说(正如您在 cmets 中所指的那样)这些对象也用于在线程之间提供“信号”。让我考虑一下,我会将这个功能添加到我的答案中。
猜你喜欢
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2012-05-07
  • 1970-01-01
  • 2012-03-12
相关资源
最近更新 更多