Mutex,Semaphore和Spin Locks之间的区别

Nov*_*ice 22 multithreading mutex semaphore ipc spinlock

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

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

fan*_*nte 51

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

这些目的旨在提供一种有效的一致的使用的"共享数据"之间超过1个线程间1个过程或从不同的过程.

这些对象可以"获得""释放".

这就对了!!!故事结局!!!

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

1)临界区用于允许只执行=用户对象一个活动线程从许多其他一个进程内.其他未选择的线程(@获取此对象)将进入休眠状态.

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

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

[进程间功能,使用非常安全,是一种'高级'同步对象].

3)Counting Semaphore(aka Semaphore) =内核对象,用于允许在一个进程内不同进程中执行来自许多其他活动线程一组活动线程.其他未选择的线程(@获取此对象)将进入休眠状态.

[进程间能力不是很安全,因为它缺乏以下'互斥'属性:线程终止通知,递归?,'优先级倒置避免'等等].

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编程系列).

  • ......当他们说"其他线程进入睡眠状态"时,这里的后来定义更具误导性**.这对我来说意味着其他线程*根本无法运行*,这完全忽略了这些机制的重点.具体来说,任何需要使用共享资源(受这些机制之一保护)的线程确实必须被阻塞(进入休眠状态),但不使用共享资源的*线程不会被置于休眠状态*. (2认同)