Warto zwrócić także uwagę na błędną implementację, w której błąd jest bardzo subtelny.
var
szerokosc_niezarezerwowana: integer := N;
szerokosc_potrzebna: integer := -1;
rozpatrywanie_rezerwacji_pojedynczo: binary semaphore := 1;
czekajacy_uzytkownik: binary semaphore := 0;
ochrona: binary semaphore := 1;
procedure rezerwacja_pasma(szerokosc_dla_uzytkownika: integer)
begin
P(rozpatrywanie_rezerwacji_pojedynczo);
P(ochrona);
if (szerokosc_dla_uzytkownika<szerokosc_niezarezerwowana) then
begin
szerokosc_potrzebna := szerokosc_dla_uzytkownika;
V(ochrona);
P(czekajacy_uzytkownik);
P(ochrona);
szerokosc_potrzebna:=-1;{dodana instrukcja}
end;
szerokosc_niezarezerwowana := szerokosc_niezarezerwowana - szerokosc_dla_uzytkownika;
V(ochrona);
V(rozpatrywanie_rezerwacji_pojedynczo);
end;
procedure zwalnianie_pasma(szerokosc_dla_uzytkownika: integer)
begin
P(ochrona);
szerokosc_niezarezerwowana := szerokosc_niezarezerwowana + szerokosc_dla_uzytkownika;
if (szerokosc_potrzebna<>-1 and szerokosc_niezarezerwowana>=szerokosc_potrzebna) then
begin
{usunieta instrukcja szerokosc_potrzebna:=-1}
V(czekajacy_uzytkownik);
end;
V(ochrona);
end;
W tej implementacji semafor czekajacy_uzytkownik może zostać podniesiony dwa (a nawet więcej) razy. Dzieje się tak dlatego, że proces, który budzi proces czekający na semaforze czekajacy_uzytkownik powinien zapewnić, że inny proces zwracający pasmo nie będzie już drugi raz podnosił semafora czekajacy_uzytkownik, a tego nie robi. W rozwiązaniu poprawnym jest to zapewnione gdyż proces, który jako pierwszy budzi proces czekający na semaforze czekajacy_uzytkownik ustawia szerokosc_potrzebna na -1 i tym samym powoduje, że nikt inny nie będzie budził czekającego na semaforze czekajacy_uzytkownik procesu.