Forum: PC-Programmierung Linux: C: Semaphoregedoens


von Dergute W. (derguteweka)


Lesenswert?

Moin,

Ist sowas von dem Kaliber OK oder muss/sollte ich da noch irgendwie 
zwischen den beiden Aufrufen warten (bis der andere Prozess, der da 
evtl. in einem sem_wait() rumduempelt, das wirklich verinnerlicht hat)?
1
sem_post(&bla);
2
sem_destroy(&bla);

Gruss
WK

von 900ss (900ss)


Lesenswert?

Wenn überhaupt sem_destroy() verwendet werden muss, weshalb nicht im 
darauf wartenden Thread?

von Oliver S. (oliverso)


Lesenswert?

Es fehlt zwar in der Frage jede Menge Kontext, aber trotzdem könnte das 
hier hilfreich sein:

https://stackoverflow.com/questions/77682605/how-to-use-sem-destroy-safely

Oliver

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Hab' derweilen mal in die glibc-sourcen geguckt und danach sieht's in 
dem Fall (glibc-2.40) so aus, als wuerden die 2 Zeilen in meinem ersten 
Post keine Probleme machen, denn in nptl/sem_destroy.c steht sowas:
1
int
2
__new_sem_destroy (sem_t *sem)
3
{
4
  /* XXX Check for valid parameter.  */
5
6
  /* Nothing to do.  */
7
  return 0;
8
}

Natuerlich gilt das nur fuer diesen Fall und diese glibc.

Gruss
WK

von Oliver S. (oliverso)


Lesenswert?

Na dann ;)

Oliver

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?


von Oliver S. (oliverso)


Lesenswert?

Leider beantwortet das die gestellte Frage überhaupt nicht.

Oliver

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ich denk schon. Da steht eindeutig die Anforderung, dass niemand mehr 
auf den Semaphor warten darf.

Ohne Kontext würde ich mal davon ausgehen, dass das bei dem von dir 
gezeigten Codeschnipsel nicht gewährleistet ist.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Jörg W. schrieb:
> Ich denk schon. Da steht eindeutig die Anforderung, dass niemand mehr
> auf den Semaphor warten darf.
Die man-page hatte ich vorher schon gelesen, hat mich aber eher nicht 
schlauer gemacht.
Ich hab' da halt einfach so ausm Bauch raus gestutzt mit den 2 Aufrufen 
so direkt hintereinander. Die Frage ist/war, ob sicher ist, dass in dem 
Moment, wo sem_post() zurueckkehrt, auch der (max. 1) Prozess, der 
dadurch evtl. aus seinem sem_wait() aufgeweckt wurde, nicht mehr auf den 
Semaphor zugreift. Klar, wenn da noch mehrere anstehen, bzw. nochmal 
sem_wait() aufgerufen werden sollte, dann rumpelts im Karton. Ist klar.

> Ohne Kontext würde ich mal davon ausgehen, dass das bei dem von dir
> gezeigten Codeschnipsel nicht gewährleistet ist.

Kontext ist da schwierig - ich guck' mir da halt den Code an, und wenn 
ich bei irgendwas mal stutzig werde, dann guck' ich halt nochmal genauer 
hin. In dem Fall hier ist's eigentlich fuer mich an der Stelle schon 
gut.
Nur guck' ich eher ungern immer gleich in den src der glibc, das ufert 
sonst oft mal arg aus :-)

Gruss
WK

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dergute W. schrieb:
> Die Frage ist/war, ob sicher ist, dass in dem Moment, wo sem_post()
> zurueckkehrt, auch der (max. 1) Prozess, der dadurch evtl. aus seinem
> sem_wait() aufgeweckt wurde, nicht mehr auf den Semaphor zugreift.

Ich würde es, wenn schon, dann in dem aufgeweckten Thread entfernen. 
Wenn der wieder läuft, ist es sicher, dass keiner mehr drauf wartet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.