Mutex,Semaphore& amp;旋锁

时间:2014-05-07 07:08:42

标签: multithreading ipc mutex semaphore spinlock

我正在使用IPC进行实验,特别是使用Mutex,Semaphore和Spin Lock。 我学到的是Mutex用于异步锁定(带睡眠(根据我在NET上读到的理论))机制,信号量是同步锁定(带信令和休眠)机制,自旋锁是同步但非睡眠机制。

  

任何人都可以帮我澄清这些东西吗?   另一个疑问是关于Mutex,当我用线程&编写程序时互斥,当一个线程正在运行另一个线程时,它不处于睡眠状态,但它不断尝试获取锁定。所以Mutex正在睡觉或不睡觉???

2 个答案:

答案 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-信号量/

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