使用信号量实现N过程障碍

时间:2011-06-13 13:46:23

标签: operating-system computer-science semaphore systems-programming barrier

我目前正在接受以前迭代的OS考试培训,我遇到了这个:

  

实施“N流程障碍”,即   是,确保每个过程都出来   他们中的一群人在某些地方等待   指出它各自的执行情况   到达他们的其他过程   给定点。

     

您有以下内容   可用的:

     

init(sem,value), wait(sem) and signal(sem)

N是任意数字。我可以使它适用于给定数量的进程,但不适用于任何数字。

有什么想法吗?用伪代码回复是可以的,这不是一项任务,只是个人学习。

3 个答案:

答案 0 :(得分:38)

这在The Little Book of Semaphores中有很好的表现。

n = the number of threads
count = 0
mutex = Semaphore(1)
barrier = Semaphore(0)


mutex.wait()
count = count + 1
mutex.signal()

if count == n: barrier.signal() # unblock ONE thread

barrier.wait()
barrier.signal() # once we are unblocked, it's our duty to unblock the next thread

答案 1 :(得分:2)

使用N个信号量。不太确定......

semaphore barr[N]
semaphore excl=1
int count=0

int i=1
while (i<=N)
   barr[i]=0 #initialization
   i=i+1

# use, each thread (tid)
wait(excl)
count=count+1
if (count==N)
   int j=1
   while (j<=N)
       signal(barr[j])
       j=j+1
   count=0
signal(excl)
wait(barr[tid])

答案 2 :(得分:0)

只有2个屏障信号量,但不确定......

semaphore barr[0..1] # two semaphores: barr[0] and barr[1]
semaphore excl=1
int count=0
int whichOne=0 # select semaphore to avoid race conditions

barr[0]=0 #initialization
barr[1]=0

# sample use
int current   #local for each thread
wait(excl)
current=whichOne
count=count+1
if (count==N)
   int j=1
   while (j<=N)
       signal(barr[current])
       j=j+1
   count=0
   whichOne=1-whichOne # swap barrier to avoid race conditions
signal(excl)
wait(barr[current])