我正在使用IPC进行实验,特别是使用Mutex,Semaphore和Spin Lock。 我学到的是Mutex用于异步锁定(带睡眠(根据我在NET上读到的理论))机制,信号量是同步锁定(带信令和休眠)机制,自旋锁是同步但非睡眠机制。
任何人都可以帮我澄清这些东西吗? 另一个疑问是关于Mutex,当我用线程&编写程序时互斥,当一个线程正在运行另一个线程时,它不处于睡眠状态,但它不断尝试获取锁定。所以Mutex正在睡觉或不睡觉???
答案 0 :(得分:48)
首先,请记住这些 '同步对象 的目标:
这些对象旨在提供 高效 和 连贯 '的使用在1个进程或来自不同进程的 多个线程 之间共享数据 。
这些对象可以 '获得' 或 '已发布' 。
就是这样!故事结束!!!
现在,如果它对你有帮助,那就让我撒上一粒沙子:
1)关键部分 =用于允许执行 一个活动线程 的用户对象 在一个过程中 。其他未选择的线程(@获取此对象)将被置于 sleep 。
[没有进程间能力,非常原始的对象]。
2)Mutex Semaphore(又名Mutex) =用于允许从其他许多人执行 一个活动线程 的内核对象,< strong> 在一个流程中 或 在不同流程中 。其他未选择的线程(@获取此对象)将被置于 sleep 。此对象支持线程所有权,线程终止通知,递归(来自同一线程的多个“获取”调用)和“优先级反转避免”。
[进程间功能,使用非常安全,是一种'高级'同步对象]。
3)计算信号量(又名信号量) =用于允许从许多其他人执行 一组活动线程 的内核对象, 在一个流程中 或 在不同流程中 。其他未选择的线程(@获取此对象)将被置于 sleep 。
[进程间功能不是很安全,因为它缺少以下'互斥'属性:线程终止通知,递归?,'优先级倒置避免'等等。)
4)现在,谈论'自旋锁',首先是一些定义:
关键区域=由2个或更多进程共享的内存区域。
Lock =一个变量,其值允许或拒绝进入“关键区域”。 (它可以实现为一个简单的'布尔标志')。
忙碌等待=连续测试变量直到出现某个值。
最后:
自旋锁定(又称自旋锁) = 锁定 ,使用 忙等待 。 (获取 锁 是由 xchg 或类似的 原子操作 强>)。
[没有线程休眠,主要仅在内核级别使用。用户级代码的能力]。
作为最后的评论,我不确定,但我可以打赌你们上面的前3个同步对象(#1,#2和#3)使用这个简单的野兽(#4)作为他们的实施。
祝你有个美好的一天!
<强> 参考文献: 强>
- 李庆和Caroline Yao(CMP Books)的嵌入式系统的实时概念。
- Andrew Tanenbaum(Pearson Education International)的现代操作系统(第3版)。
- Jeffrey Richter编程的Microsoft Windows应用程序(第4版)(Microsoft编程系列)。
答案 1 :(得分:2)
以下是信号量和互斥量之间差异的一个很好的解释:
http://blog.feabhas.com/2009/09/mutex-vs-semaphores- - 部分-1-信号量/
简短的回答与至少使用二进制信号量的所有权有关,但我建议你阅读整篇文章。