2017-12-05 20 views
0

Ich habe eine andere Anzahl von Prozess, die auf den Shared Memory schreiben sollte, die ich bereits definiert habe. Ich versuche es mit System V-Semaphoren. Die Semaphore (sem_access) auf 1 initialisiert wirdErhalte Zugriff auf shared Memory durch Semaphore

sem_access.sem_op = -1; 
    semop(sem_access_id, &sem_access, 1); 

    info->index++; 
    printf ("INDEX= %d\n", info->index); 

    sem_access.sem_op = 1; 
    semop(sem_access_id, &sem_access, 1); 

Das Problem ist, dass die printf druckt immer die gleiche Anzahl, ohne den Index zu erhöhen. PS: Sorry für mein schlechtes Englisch, aber ich bin Spanisch. edit: wenn ich eine sleep(1) einfüge funktioniert es gut, aber ich will wirklich nicht den Schlaf!

+0

Was ist der Rückgabewert von Ihrem 'semop()' Anrufe? Du ignorierst das. –

+0

Es gibt 0 zurück, kein Fehler –

Antwort

0

geben Sie einige weitere Informationen über Ihren Code. Welches Problem bekommst du? Bleibt Ihr Prozess hängen, sobald Ressourcen erworben wurden oder nicht warten?

Manpage von semop() sagt:

1) Wenn sem_opless than zero ist, wird der Prozess alte Genehmigung der semaphore set auf haben muss. Also wenn sem_access.sem_op = -1; Wenn ein anderer Prozess diesen Wert auf 0 oder größer als 0 setzt, greift nur dieser Prozess auf freigegebene Ressourcen zu.

Prozess 1: sem_access.sem_op = -1; // dieser Vorgang, bis Bedingung nicht erfüllen

Prozess 2 warten wird: da in ersten Prozess sem_op Wert -1 ist, muss dieser Prozess machen sem_op Wert als 0 oder 1 dann nur andere Verfahren erhalten ausgeführt werden, so tun wie diese

sem_access.sem_op = 1; 

als man-Seite von semop() sagt: Wenn sem_op eine positive ganze Zahl ist, fügt der Betrieb this Wert zum Semaphorwert (semval). jetzt sem_op wird -1 + 1 = 0, siehe auch semop() Manpages "Dies ist eine" wait-for-zero "Operation: Wenn smalval Null ist, kann die Operation sofort fortgesetzt werden".

Ich hoffe, Sie haben eine Idee, um das Problem zu lösen.

+0

Der Prozess läuft gut, aber der Variablenindex wird nicht gut inkrementiert. Wenn ich einen Schlaf() vor oder nach dem Inkrement einfüge, funktioniert es gut. –

+0

@ JimBelushi Schlaf ist nicht die richtige Lösung für die Planung, einmal fertig gemacht haben Sie Semval Wert als 0 mit Semcatl() oder manuell – achal

+0

Ich weiß, dass es nicht korrekt ist! Der Prozess führt den Code nacheinander nach dem Semaphor aus, so dass der Semaphor korrekt funktioniert, der Variablenindex jedoch nicht korrekt aktualisiert wird –