Ich begann an dem Konzept der Semaphoren zu zweifeln; Bitte lesen Sie auch mein Problem zu verstehen ...Bedingung, um sicherzustellen, dass dieses Producer-Consumer-Beispiel nicht blockiert wird?
die manuelle Nach wird sem_post
einen Thread entsperren, wenn der Wert der Semaphore größer wird als 0
... also wenn ich diesen Code:
void* producer(void* arg)
{
while(1)
{
sem_wait(&sem_produce);
sem_wait(&mutex);
// Insert item into buffer
sem_post(&mutex);
sem_post(&sem_consume);
}
pthread_exit(NULL);
}
void* consumer(void* arg)
{
while(1)
{
sem_wait(&sem_consume);
sem_wait(&mutex);
// Remove item from buffer
sem_post(&mutex);
sem_post(&sem_produce);
}
pthread_exit(NULL);
}
Wo sem_consume
wird mit dem Wert 0
initialisiert, und sem_produce
wird mit N
initialisiert.
Was passiert, wenn zum Beispiel die N
Verbraucher vor Produzenten laufen und versuchen zu konsumieren? Dann sem_consume
sollte den Wert -N
haben, und wenn dann N
Einfügungen, sem_consume
und sem_produce
beide sollten 0
sein, oder bin ich falsch? Dann bedeutet das, dass die Verbraucher feststecken würden, weil (gemäß der Anleitung) sem_post
einen Thread entsperrt, wenn der Wert der Semaphore größer als Null wird ...
Also von dem, was ich aus dem Handbuch verstehe und unter Berücksichtigung des obigen Beispiels, das Dieses Programm funktioniert nur, wenn sem_consume
niemals den Wert -N
erreicht.
Ich habe Recht? Wenn ja, wie kann ich das Beispiel verbessern, damit es nicht hängen bleibt? Wenn die Antwort nein ist, woran ich mich geirrt habe?
"dann sollte sem_consume den Wert von -N haben". Das kann niemals passieren. Es ist überall in den Semaphor-Handbüchern geschrieben. [sem_overview manual] (http://man7.org/linux/man-pages/man7/sem_overview.7.html) sagt: "Ein Semaphor ist eine ganze Zahl, deren Wert ** niemals unter Null fallen darf **". [sem_wait] (http://man7.org/linux/man-pages/man3/sem_wait.3.html): "Wenn der Semaphor aktuell den Wert Null hat, dann blockt der Aufruf, bis es entweder möglich ist, das Dekrementieren durchzuführen (dh der Semaphorwert steigt über Null), oder ein Signal-Handler unterbricht den Ruf. " – kaylum
Wenn die Konsumenten vor den Produzenten laufen, dann werden die Konsumenten auf "sem_consume" warten, bis ein Produzent es geschafft hat, 'sem_post (& sem_consume)' zu machen, oder? Und nur ein Konsument wird für jeden 'sem_post (& sem_consume)' laufen. Es werden "N" -Elemente in die Warteschlange eingereiht, bevor die Produzenten blockiert werden und auf den Konsum eines Verbrauchers warten. –
Das ist merkwürdig, in meinem parallelen Programmierkurs dachte ich, ich hätte vom Lehrer gehört, dass der Wert eines Semaphors negativ sein könnte und dass dieser negative Wert die Anzahl blockierter Threads darstellen würde. Wenn dieser Wert nicht negativ sein kann, dann habe ich keinen Zweifel. – OiciTrap