Semaphor löschen?
-
Hi everyone
Ich habe letztens eine primitive Semaphor-Absicherung für meine serielle Schnitstellen-Klasse implementiert. Dabei kommt es vor, dass derselbe Prozess mehrmals gestartet und die beiden Instanzen dann auf dieselbe Ressource mit demselben Semaphor zugreifen - darum habe ich das ganze ja überhaupt eingebaut
.
Nun ist es allerdings so, dass ich dringend geraten bekommen habe, den Semaphor bei Programmende wieder zu löschen (Semaphoren seien begrenzte Ressourcen, könne auch zu Fehlern führen, etc.). Nun stellt sich bei mir die Frage: Wann soll ich den Semaphor löschen?
Es ist gut möglich, dass die erste Programminstanz lange vor der zweiten terminiert. Den Semaphor bei Programmende zu löschen, könnte im zweiten Prozess einen Fehler verursachen (z.B. wenn dieser den Semaphor schon via semget geöffnet und jetzt mit semop zugreifen möchte) .
Gibt es da eine Standard-Vorgehensweise?
Vielen Dank für eure Antworten und beste Grüsse
Kessi
-
Du kannst in jeder Instanz Semaphorwert erhöhen:
/*semaphor um 1 erhoehen */ semaphore.sem_num = 0; semaphore.sem_op = 1; semaphore.sem_flg = SEM_UNDO;/*wird automatisch vom kernel entfernt falls prozess beendet*/ semop(semid, &semaphore, 1);
Und Semaphor dann löschen wenn semaphor wert 0 ist:
if(semctl(semid, 0, GETVAL, 0) == 0) { semctl (semid, 0, IPC_RMID, 0); }
-
Hmmm... Ok, das wäre ja schon 'mal grundsätzlich wichtig. Allerdings ist das Öffnen eines Semaphors mit semget und das Beziehen einer Marke mit semop zusammen keine atomare Operation mehr.
Mit dieser Lösung wäre es also trotzdem möglich, dass bevor Prozess 1 den Wert des Semaphors überprüft hat, der konkurrierende Prozess 2 ihn öffnet und bevor dieser wiederum effektiv darauf zugreift, Prozess 1 ihn bereits wieder löscht...
Ich wollte mit den Semaphoren eigentlich Race Conditions bekämpfen und nicht noch speziell welche einbauen
.
Das Unix Semaphor-Konzept scheint mir diesbezüglich nicht ganz durchdacht...