Синхронизация процессов с использованием семафоров - PullRequest
0 голосов
/ 29 сентября 2011

Вот проблема. Я хочу, чтобы два процесса происходили поочередно, полная проблема здесь.

Q. В системе есть два процесса с именами A и B. Когда система запускается, процесс A выполняется дважды, затем процесс B выполняется один раз. Процесс B не может выполняться, пока процесс A не будет выполнен дважды. После выполнения процесса A он не может выполняться снова, пока не будет выполнен процесс B. Упомянутое выше ограничение позволяет процессам A и B выполняться следующим образом.

AABAABAAB ...

Напишите псевдокод для процессов A и B, используя счетный семафор для достижения желаемой синхронизации.

Вот моя попытка сделать это.

Решение:

Процесс A

var a=1,b=0,i;
begin
repeat
    wait(a);
    for(i=0;i<2;i++)
    printf("A");  // conidering this is what process a does.
    signal(b);
forever
end

Процесс B

begin
repeat
    wait(b);
    printf("B"); //considering this is what process B does.
    signal(a);
forever
end

Это правильно?

Ответы [ 2 ]

1 голос
/ 12 февраля 2012

Альтернативное решение было бы:

Semaphore as = 1;
Semaphore bs = 0;

A() {
  int counter = 0;
  while(TRUE) {
    if(counter % 2 == 0)
      P(as);
    print("A"); // and whatever A does
    counter++;
    if(counter % 2 == 0)
      V(bs);
  }
}

B() {
  P(bs);
  print("B"); // and whatever B does
  V(as); 
}

Идея состоит в том, что A ждет B на каждом 2-м ходу (кроме 0-го).

0 голосов
/ 30 сентября 2011

Я думаю, что общая идея верна, но терминология довольно странная. Пара сигналов ожидания обычно используется для условных переменных (хотя, например, семафор POSIX использует post / wait).

Я предлагаю вам заменить wait на semaphore_down и signal на semaphore_up.

...