2012-04-18 1 views
5

Also, wenn ich ein Semaphore gesetztsemid mit num_of_sems Semaphore und ein sembuf*deleter_searchers_downSemop: Wenn ein Satz von Semaphoren verkleinert wird, werden alle auf einmal dekrementiert oder blockiert er beim ersten Fehler?

struct sembuf *deleter_searchers_down 
         = malloc(sizeof (*deleter_searchers_down) * num_of_sems); 
for (i = 0; i < num_of_sems; ++i) { 
      (deleter_searchers_down + i)->sem_op = -1; 
      (deleter_searchers_down + i)->sem_num = i; 
      (deleter_searchers_down + i)->sem_flg = SEM_UNDO; 
     } 
semop(semid, deleter_searchers_down, num_of_sems); 

Der Anruf wird versuchen, semop alle Semaphore in der Menge zu senken, auf einmal oder wird es sperren, sobald er versucht, den ersten Semaphor, der 0 ist, zu senken und nach einigen anderen Prozessen diesen bestimmten Semaphor fortzusetzen?

+0

Nun Semaphore tun genau das, was Sie sagen, das heißt, wenn sie gesenkt werden, wenn sie 0 sind, blockieren sie den Prozess. – byrondrossos

+0

Lesen Sie die Frage sorgfältig plz - Willen semop versuchen, alle die Menge zu senken und auf alle Null zu blockieren oder wird es auf der ersten (ersten?) Aufgetreten 0 –

+0

Sie können IPC_NOWAIT angeben, um sofort bei einem Fehler zurückzukehren. Siehe: http://pubs.opengroup.org/onlinepubs/7908799/xsh/semop.html – RedX

Antwort

6

Es werden keine Aktualisierungen durchgeführt, bis alle Aktualisierungen als eine Einheit fortgesetzt werden können.

Die POSIX-Spezifikation könnte über diesen Punkt klarer sein, obwohl es besagt, dass semop atomar ist.

Unter Linux ist semop(3) in Glibc ein einfacher Wrapper um semop(2). Die semop(2) -Manpage wiederum sagt

Der Satz von Operationen in sops enthalten ist, in Array Reihenfolge durchgeführt und atomar, das heißt, werden die Operationen durchgeführt, entweder als komplette Einheit, oder gar nicht.

Der HP-UX semop(2) -Manpage ist noch deutlicher:

Semaphore Array-Operationen sind atomar daß keine der Semaphor-Operationen bis blockierende Bedingungen auf allen der Semaphore in das Array durchgeführt werden, wurden entfernt.

+0

Danke - Bedeutet dies, dass der Prozess, der versucht, das semid unten zu blockieren, auf dem ersten Feldelement ist, das 0 ist und semop() alle vorherigen Feldelemente downs() annulliert? –

+0

Dies liegt an der Implementierung. Als ein Beispiel, der Code in Linux ipc/sem.c (Funktion 'try_atomic_semop') tut etwas ähnliches, was Sie beschreiben. Es versucht die Operationen, und wenn einer von ihnen blockiert, werden Änderungen rückgängig gemacht. Aber es gibt einen wichtigen Punkt: Die Aktualisierungen werden ausgeführt, während das Semaphor-Set gesperrt ist. Daher ist der inkonsistente Zustand für keine andere Aufgabe sichtbar: Eine Task, die den Semaphor ändern möchte, müsste zuerst das Schloss erwerben, und eine auf dem Semaphor blockierte Aufgabe ist bereits eingeschlafen. Am Ende ist die Operation also wirklich atomar. –

+0

Ok - danke - ein letzter Punkt: Es gibt keine Chance (Implementierung) der Prozess aufrufen Semop wird auf _all_ Semaphoren, die 0 sind blockiert? –

Verwandte Themen