2012-05-21 40 views
0

考虑以下用途:使用二进制信号量作为互斥量 - 它是否是免费的?

Shared data: semaphore lock; // initially lock = 1 
... 
down(lock); 
CRITICAL SECTION 
up(lock); 

这段代码满足饥饿的自由(即,如果一个进程等待获得CS里面,它终究会成功)?

+0

看起来像你粘贴的伪代码。什么样的'信号量'是'锁定'?什么是“下”和“上”? – ArjunShankar

+0

@ArjunShankar:我可以想象,'down'和'up'是与信号量相关的标准操作。 –

+0

无论如何,假设'down(lock)'是一种获得独占访问的方式,它真的取决于'down(lock)'是否公平。即如果有多个线程在等待它,那么决定哪个线程胜出的逻辑是什么。 – ArjunShankar

回答

1

这真的取决于在多个线程正在等待down(lock)时选择线程时使用的策略。

例如

  1. 如果此策略基于队列,则可以保证免于饥饿。
  2. 如果任意选择了多个等待线程中的一个,那么你可能会因为运气不好而饿死。
  3. 如果它是基于优先级的,那么只要高优先级的线程继续请求锁,低优先级的线程就会饿死。

例如,Java的计数Semaphore在创建时可以配置为“公平”或不是。在这里,'公平'是指等待线程将放入FIFO中,以便等待最长的线程首先被执行。