2015-04-21 23 views
5

Ho un grosso problema con i semafori in C. Ecco il link all'ispirazione del mio codice: http://cse.unl.edu/~ylu/csce351/notes/Solution%20for%20Building%20H2O.pdf.Processi paralleli che utilizzano semafori in C

Esistono due codici simili per l'idrogeno e l'ossigeno. Questa è l'idea: ci sono processi generati per l'ossigeno e l'idrogeno e vengono creati in tempi diversi. Quando ci sono 2 idrogeni e 1 ossigeno chiamano la funzione bond(). Ma devono aspettarli. Dopo che la condizione è stata valutata come falsa, si dovrebbe passare a un altro processo (o almeno è così che lo capisco). Ma nel mio codice continua al comando successivo, il che fa sì che non attenda tutti i processi di cui ho bisogno. Stampa in output dopo ogni processo creato anche se si suppone che aspetti. Qualcuno sa cosa c'è di sbagliato lì?

(posso postare più del codice, se questo non è sufficiente.) CODICE

OSSIGENO: (idrogeno è simile)

sem_wait(mutex); 
if ((*hydrogen >=2) && (*oxigen>=1)) 
{ 
    (*count_c)++; 
    *count_cur_h-=2; 
    sem_post(hydrel); 
    sem_post(hydrel); 
    *count_cur_o-=1; 
    sem_post(oxrel); 
} 
else 
{ 
    (*count_c)++; 
    sem_post(mutex); // This is the place where it is supposed 
         // to release and continue to another process, 
         // but it goes to the next command. 
} 

sem_wait(oxrel); 
bond(); 
sem_wait(barrier); 

//semaphores are initialized like this: 
sem_init(mutex,1,1); 
sem_init(oxrel,1,1); 
sem_init(hydrel,1,2); 
sem_init(barrier,1,3); 
+0

Come definite questi mutex, dove sono? Dovrebbero trovarsi in una memoria condivisa poiché stai creando mutex condivisi tra i processi. Inoltre, quando dici * continui su un altro processo * nel tuo commento, intendi al risveglio di un altro processo (in attesa di 'mutex')? Un'altra cosa, si acquisisce il mutex ma lo si rilascia solo in altre condizioni. È questo il comportamento previsto? – holgac

+0

I semafori sono nella memoria condivisa. E intendevo dire che continuate ad aspettare finché non ci saranno 2 idrogeni e ossigeno. Per quanto riguarda il collegamento, c'è la stessa cosa (la stessa cosa è nel libro "il piccolo libro dei semafori" che è usato come riferimento nel nostro progetto scolastico) –

+0

Inoltre, dove è rilasciato 'barrier' in il tuo codice? Il codice nel tuo link usa 'mutex.signal()' invece di 'barrier.wait()', che fa il tuo codice. Un'altra nota: 'sem_post' non passerà a un altro processo, il chiamante continuerà a funzionare. Il codice nel collegamento sembra basarsi sull'acquisizione di mutex per fermare il processo corrente. La barriera – holgac

risposta

1

sem_post non è una chiamata di blocco. sem_wait è la chiamata bloccante. Se il valore del semaforo è zero quando viene chiamato sem_wait, la funzione che lo ha chiamato bloccherà. sem_post è usato per rilasciare un altro thread che sta bloccando l'attesa su sem_wait quando il valore del semaforo è zero, ma lo fa non il blocco stesso. La chiamata sem_post viene utilizzata per 'svegliare un thread in attesa su sem-wait', ma poi continua in seguito, ed entrambi i thread verranno eseguiti contemporaneamente (se si hanno almeno 2 CPU logiche). Se vuoi che il thread che ha chiamato sem_post per bloccare a quel punto, dovrai fare qualcos'altro (ad esempio aggiungi un altro semaforo).