Реализация N-процессного барьера с использованием семафоров - PullRequest
19 голосов
/ 13 июня 2011

В настоящее время я готовлюсь к экзамену по ОС с предыдущими итерациями, и я сталкивался с этим:

Реализация «барьера N процессов», то есть обеспечение того, чтобы каждый процесс выходил из группы.из них в какой-то момент своего выполнения ожидает, пока другие процессы достигнут своей заданной точки.

Доступны следующие операции:

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

N - произвольное число.Я могу сделать так, чтобы он работал для заданного числа процессов, но не для любого числа.

Есть идеи?Можно ответить псевдокодом, это не задание, а личное изучение.

Ответы [ 3 ]

38 голосов
/ 13 июня 2011

Это хорошо представлено в Маленькая книга семафоров .

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
2 голосов
/ 18 декабря 2015

Использование 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])
0 голосов
/ 18 декабря 2015

Только 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])
...