最近我读了一篇有趣的博客,比较了互斥量和信号量:
"
http://www.feabhas.com/blog/2009/09/mutex-vs-semaphores-%E2%80%93-part-1-semaphores/
"
引用它:
"
如果在该任务处于关键区域时发生上下文切换,而另一个任务也在P(S)上调用,那么第二个任务(以及任何后续任务)将被阻止进入关键区域操作系统处于等待状态.稍后,第一个任务被重新安排,并调用V(S)表示它已离开关键区域.现在允许第二个任务访问关键区域.
如果信号量的确如此,那么互斥量也是如此吗?我不认为它是真的,好像一块代码被锁定,它应该是"原子的",不能被上下文切换或中断.我对吗?
Jon*_*eet 13
不,上下文切换几乎可以在任何地方发生.虽然通常最好尽可能短时间地保持锁定,但是你不希望你的整个机器只是因为一个进程有多个线程持有锁而有核心,等待某些事情发生,你会不会?
锁定的目的是防止可能干扰锁中代码的代码被执行 - 它不会在系统的每个进程中停止执行所有其他代码.(毕竟,上下文切换到不同的进程仍然是一个上下文切换.)
这取决于您正在处理的"关键部分"的版本.例如,在OS/2(首先包含关键部分的当前Windows的前身)中,进入关键部分阻止了在同一进程中切换到不同的线程.在Windows NT中,他们改变了这一点,因此允许线程切换,因此只有在/尝试进入相同的关键部分时才会阻止其他线程.
在这两种情况下,关键部分都是进程的本地部分,因此不同进程中的线程永远不会尝试进入同一个关键部分.
在其他系统上,您必须查看关键部分(假设它有一个)如何指定以了解它允许/禁止的内容.没有通用的定义.