2017-05-01 3 views
0

Ich arbeite mit Semaphoren und ich kämpfe mit einem Teil des Codes.
Code:C Semaphoren mit sem_wait()

// semaphore initialized to zero 
for(int i = 0; i < N; i++) 
{ 
    fork(); 
    // statements 
    sem_wait(semaphore); 
    printf("Process %d is done\n", i); 
    exit(0); 
} 

for(int i = 0; i < N; i++) 
{ 
    sem_post(semaphore); 
} 

Problem ist, stoppt die Schleife nach der ersten Iteration wegen sem_wait, aber ich würde es nur den aktuellen Prozess stoppen möchten, so dass alle anderen Iterationen und am Ende durchgeführt werden kann Code, ich werde alle Prozesse "freigeben". Gibt es einen Weg, dies zu erreichen?
Danke!

EDIT:

// initialization of semaphore 
semaphore = mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); 
sem_init(semaphore, 1, 0); 
+0

Zeig uns, wie hast du 'semarophe' Variable initialisiert. –

+0

Können Sie erklären, was Sie mit dem "aktuellen Prozess" meinen? Sobald Sie erklären, was Sie damit meinen, wickeln Sie einfach den Aufruf zu 'sem_wait' in einer' if'-Anweisung, die alles testet, was Sie testen müssen. –

+0

Nun, in For-Schleife nrufe ich 'fork()' N mal, also erstelle ich N Prozesse. Der aktuelle Prozess bedeutet jeden Prozess bei jeder Iteration. – SevO

Antwort

1

Bitte überprüfen Gabel Rückgabewert. Auf dieser Basis werden Sie sicher sein, ob Code unter Kind- oder Elternprozess ausgeführt wird. Rufen Sie dementsprechend sem_wait auf.

Verwandte Themen