Procedura V inkrementuje semafor S, natomiast procedura P dekrementuje go:
procedure V (S : Semaphore); begin (* Operacja atomowa: inkrementacja semafora *) S := S + 1; end;
(* Operacja atomowa: dekrementacja semafora *) procedure P (S : Semaphore); begin (* Cała operacja jest atomowa *) repeat Wait(); until S > 0; S := S - 1; end;
Wartość semafora S to liczba jednostek zasobu, na które nie zgłoszono żądania. Jeżeli istnieje tylko jeden taki zasób, semafor binarny jest używany jako zwykła flaga true/false. Operacja P oczekuje i zasypia, dopóki zasób kontrolowany przez semafor nie stanie się dostępny, gdy natychmiast zgłaszane jest żądanie oczekującego zasobu. Operacja V jest odwrotna: zwalnia ponownie zasób po tym, jak proces przestał go używać.
Koncepcja semafora liczącego może zostać rozszerzona poprzez możliwość zażądania lub zwrócenia więcej niż jednej jednostki od semafora – technika implementowana w Uniksie. Zmodyfikowane operacje V i P będą wyglądały następująco:
procedure V (S : Semaphore; I : Integer); begin S := S + I (* operacja atomowa *) end;
procedure P (S : Semaphore;