17. September 2010

Semaphore Visual C Mingw

Heute mal ein ganz anderes Thema: Programmierung. Speziell: Semaphore. Der Herr Dijkstra hat sich da ja was Tolles einfallen lassen mit P und V und was nicht alles. Unter Linux ist die Programmierung in C eigentlich kein Problem. Unter Windoofs sucht man sie jedoch etwas länger.
Unter Mingw und Visual C gibt es folgende Funktionen:
  • CreateSemaphore
  • ReleaseSemaphore (entspricht V, also semaphore give)
  • WaitForSingleObject (entspricht P, also semaphore take)
(also so weit hab ich das Beispiel verstanden)
Insgesamt scheint die Benutzung der Funktionen etwas hässlich zu sein. Aber bevor man die Funktionen von Hand schreibt....
Es gibt jedoch noch eine dritte (weniger oft erwähnte) Funktion: Nulltest oder Nullcheck genannt. Hierbei wird überprüft, ob ein Semaphore den Wert 0 erreicht hat. Unter Linux lässt sich diese Funktion ebenfalls problemlos benutzen. Unter Windoofs scheint es allerdings nicht so ohne Weiteres zu gehen. Folgender Ersatzkonstrukt fiel mir heute dazu ein:

function nulltest()
{
success = semaphore_take(NOWAIT);
if (success)
{
semaphore_give(); //important!
return false; //nulltest was not successful,
}
else //nulltest was successful, semaphore value == 0
return true;
}

Im Prinzip nicht allzu kompliziert. Der Trick ist einfach, den Semaphor testweise zu dekrementieren (und im Erfolgsfall sofort wieder zu inkrementieren). Schlägt dies fehl, weil der Semaphor bereits bei 0 angekommen ist, ist der Nulltest erfolgreich. Ganz wichtig dabei: das Dekrementieren muss nichtblockierend aufgerufen werden (non-blocking / nowait). Ansonsten ist das Ganze für die Tonne. Wer noch mehr Wissen zu Semaphoren und Windows bzw. Visual C hat, kann sich gern melden. Auch in englisch.

Keine Kommentare: