我正在用IPC做实验,特别是Mutex、Semaphore和Spin Lock。我学到的是Mutex用于异步锁定(根据我在NET上阅读的理论)机制,信号量是同步锁定(具有信号和Hibernate)机制,自旋锁是同步但不Hibernate机制。
有人能帮我深入澄清这些东西吗?另一个疑问是关于Mutex,当我用线程编写程序时
首先,记住这些“同步对象”的目标:
这些对象旨在为一个进程中的多个线程或不同进程之间的“共享数据”提供高效且一致的使用。
这些对象可以“获取”或“释放”。
就是这样!!!故事结束了!!!
现在,如果它对你有帮助,让我把我的沙粒:
1)关键部分=用户对象,用于允许在一个进程中仅执行来自许多其他线程的一个活动线程。其他未选择的线程(@获取此对象)被置于睡眠状态。
[没有进程间功能,非常原始的对象]。
2) Mutex Semaphore(又称Mutex)=内核对象,用于允许在一个进程内或在不同进程之间执行多个其他线程中的一个活动线程。其他未选择的线程(@获取此对象)将进入Hibernate状态。此对象支持线程所有权、线程终止通知、递归(来自同一线程的多个“获取”调用)和“优先级反转避免”。
【进程间能力,使用非常安全,一种‘高级’同步对象】。
3)Counting Semaphore(又名Semaphore)=内核对象,用于允许在一个进程内或不同进程之间执行来自许多其他线程的一组活动线程。其他未选择的线程(@获取此对象)被置于睡眠状态。
[然而,进程间功能使用起来不是很安全,因为它缺乏以下“互斥锁”属性:线程终止通知、递归?、“优先级反转避免”?等]。
4)现在,谈论“自旋锁”,首先是一些定义:
关键区域=由两个或多个进程共享的内存区域。
Lock=其值允许或拒绝进入“关键区域”的变量。(它可以实现为简单的“布尔标志”)。
忙于等待 = 持续测试变量,直到出现某个值。
最后:
自旋锁(又名自旋锁)= 使用繁忙等待的锁。(锁的获取是通过 xchg 或类似的原子操作完成的)。
[没有线程睡眠,主要用于内核级别。对于用户级别的代码无效]。
作为最后一个评论,我不确定,但我可以跟你打赌,上面的前三个同步对象(#1、#2和#3)利用这个简单的beast (#4)作为它们实现的一部分。
祝你今天开心!。
参考文献:
-《嵌入式系统的实时概念》,李青与姚嘉玲合著(CMP图书)。
-现代操作系统(第3)由Andrew Tanenbaum(皮尔逊教育国际)。
-Jeffrey Richter(Microsoft编程系列)为Microsoft Windows编程应用程序(第4版)。
以下是对信号量和互斥体之间区别的一个很好的解释:
http://blog.feabhas.com/2009/09/mutex-vs-semaphores---第1部分-信号量/
简短的回答与所有权有关,至少与二进制信号量有关,但我建议您阅读整篇文章。
互斥是锁定机制,而信号量是等待和信号机制。两者都有不同的应用。
IISC教授给出了一个非常好的解释。
视频链接