Как работает следующее приложение Семафор в C? - PullRequest
0 голосов
/ 05 января 2012

Это psuedocode для синхронизации задач с использованием семафора. Операция включает проверку безопасности между передачей данных.

Begin_Security_Check=create_semaphore(0);
Security_Check_Done=create_semaphore(0);

Task Security_Check
{
    while(true)
    {
        wait_semaphore(Begin_Security_Check);
          (*actions check data*)
        signal_semaphore(Security_Check_Done);
    }
}

Task Download_Data;
{
      (*actions to download data from WAN to router buffer*)
    signal_semaphore(Begin_Security_Check);

    wait_semaphore(Security_Check_Done);
      (*actions to download data from router buffer to LAN*)
}

В заметках я читаю:

s = create_semaphore (v); Где v = 0 или 1

wait_semaphore (с); Если s = 1, тогда установите s = 0 и разрешите выполнение вызывающей задачи, в противном случае приостановите вызывающую задачу.

signal_semaphore (s); Если нет задачи, ожидающей семафор, при установке s = 1, в противном случае возобновите любую задачу, которая ожидает семафор s.


Но это означает, что wait_semaphore(Begin_Security_Check); имеет значение 0, потому что Begin_Security_Check=create_semaphore(0);, верно? Это значит, что оно должно приостановить вызывающую задачу? Первые два определения имеют create_semaphore(0); - это означает, что они оба одинаковы?

Я действительно запутался, может кто-нибудь, пожалуйста, пошагово объясните, как работает этот псевдокод?

Ответы [ 2 ]

2 голосов
/ 05 января 2012

Вы правы в этом, если Security_Check доберется до wait_semaphore до того, как что-либо еще произойдет, он будет ждать.Но обратите внимание, что первое, что делает Download_Data (без семафоров): он сигнализирует о том самом семафоре, который пробудит Security_Check.Это именно тот тип синхронизации, который вам нужен.

1 голос
/ 05 января 2012

Изначально мы создаем два семафора, каждый со значением 0.

Теперь я предполагаю, что эти два Tasks каким-то образом запускаются в отдельных потоках - в частности, Task Security_Check кажется зацикленным навсегда, поэтому он должен сидеть в своем собственном потоке в ожидании работы. Когда он вызывает wait_semaphore(Begin_Security_Check);, он приостанавливается, пока кто-то не сигнализирует Begin_Security_Check.

Теперь кто-то звонит Download_Data. Он делает все, что нужно для загрузки данных, а затем подает сигнал семафору Begin_Security_Check. Это пробуждает поток Security_Check, который затем выполняет все, что ему нужно, и сигнализирует семафор Security_Check_Done. Тем временем поток загрузки переходит на wait_semaphore(Security_Check_Done);, заставляя его приостанавливаться до тех пор, пока Task Security_Check не сообщит этот семафор. Так что он не будет продолжаться до тех пор, пока проверка безопасности не будет завершена.

...