Linux: C: Semaphoregedoens

OP #7898835
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

OP #7898917
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

OP #7898971
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

Moderator Persönliche Seite #7899030
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren