|
|
|
![]() |
|
Strumenti |
![]() |
#21 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Che compilatore usi ?
Un'altra cosa non capisco... come mai nel file hai incluso i pthread ? Poi non li usi mi sembra ... |
![]() |
![]() |
![]() |
#22 |
Member
Iscritto dal: Mar 2001
Città: Pordenone
Messaggi: 73
|
veramente non lo neanche io perchè includiamo pthread.h. evidentemente è stata una modifica in corso d'opera.
il compilatore che uso in Windows è ... LCC-Win32. il problema è che il cambiamento di stato del semaforo a destra e a sinistra non viene mai effettuato. e allora come posso modificare??? Ciao, Paplo P.S: l'ultima modifica è questa ...
__________________
Età : 28 - Sviluppatore PHP |
![]() |
![]() |
![]() |
#23 |
Senior Member
Iscritto dal: Dec 1999
Messaggi: 139
|
scusa ma...se la memoria non mi inganna(ho studiato sta roba anni fa e da allora non ho più avuto occasione di usarla):
tu ridefinisci il tipo int come tipo semaphore. definisci le funzioni wait e signal che usano il tuo tipo semaphore cioè un semplice int... Ma queste non sono funzioni atomiche. Devi usare quelle fornite dal sistema operativo che nel caso di linux sono contenute nelle librerie wait.h, signal.h, unistd.h pthread.h ecc ecc (in win non saprei). Altrimenti la sincronizzazione tra processi non funzionerà mai.
__________________
Ingegnere: colui che ha molta familiarità con i modelli e molto poca con le modelle. |
![]() |
![]() |
![]() |
#24 |
Member
Iscritto dal: Mar 2001
Città: Pordenone
Messaggi: 73
|
x MickMacello
non capisco quello che vuoi dire!? cmq. per il mio programma ho preso spunto dal programma dei 5 filosofi. ecco le funzioni wait e signal che ho trovato ... " void wait(semaphore s) { int junk; if(read(s[0], &junk, 1) <= 0) { printf("ERROR: wait() fallita in creazione semaforo!\n"); exit(1); } } void signal(semaphore s) { if(write(s[1], "x", 1) <=0){ printf("ERROR: write() fallita nella creazione semaforo!\n"); exit(1); } } "
__________________
Età : 28 - Sviluppatore PHP |
![]() |
![]() |
![]() |
#25 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Così non va bene...è solo una simulazione della wait e della signal in caso di singolo processo...
La wait e la signal come già datto da MickMacello devono essere operazioni atomiche ovvero devono essere system call che lavorando a livello del kernel non possono essere interrotte dallo scheduler (o da altri programmi)... Poi hai implementato il blocco sulla wait come una funzione chiamata up...quella funzione non esiste perchè è già implementata dalla system call wait... In pratica wait è così : Codice:
void wait(semaphore *s) { if ((*s)==0) mi_metto_in_attesa_passiva(); //ovvero lo schedule mi mette in //coda dei processi bloccati sul semaforo s --(*s); } Codice:
void signal(semaphore *s) { ++(*s); } Ad esempio lo scheduler ti toglie il processore suito dopo averti svegliato da una wait...prima di eseguire --s...un altro processo fa una wait (s in questo momento è a 1 perchè un altro processo ha fatto una signal per svegliare il processo in attesa sul semaforo)...la wait non blocca per questo processo e s va a 0... Ora che succede, quendo al primo processo viene riassegnato il processore esegue --s...quindi il semaforo si porta in uno stato inconsistente e probabilmente non più recuperabile !!! Quindi sia wait che signal devono essere atomiche...quindi system call !!! |
![]() |
![]() |
![]() |
#26 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Inoltre le varie funzioni up, down, wait e signal che ha usato sono concettualmente sbagliate perchè dovrebbero lavorare con puntatori...altrimenti il valore di s che viene cambiato all'interno delle funzioni è solo valido all'interno delle stesse (fai un passaggio deid ati per valore)...
|
![]() |
![]() |
![]() |
#27 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
azz... io non me n'ero accorto... pensavo usate chiamate di sistema !
|
![]() |
![]() |
![]() |
#28 |
Member
Iscritto dal: Mar 2001
Città: Pordenone
Messaggi: 73
|
x Cionci
ho effettuato le modifiche che mi hai suggerito, però ... mi da questi errori ... "passing arg 1 of 'wait' from incompatible pointer type" "passing arg 1 of 'signal' from incompatible pointer type" presumo da ciò che devo creare una funzione che crei un semaforo, è vero?! ma come devo fare!?!? AIUTO!!! inoltre ho modificato il tuo wait affinchè se il semaforo S non è verde esca, ovvero salti il turno Codice:
void wait(semaphore *s) { if ((*s)==0) exit(1); //ovvero lo schedule mi mette in //coda dei processi bloccati sul semaforo s --(*s); } Grazie mille, Paplo P.S. ecco il listato ...
__________________
Età : 28 - Sviluppatore PHP |
![]() |
![]() |
![]() |
#29 |
Member
Iscritto dal: Mar 2001
Città: Pordenone
Messaggi: 73
|
il listato precendete è errato.
ve lo rimando corretto ...
__________________
Età : 28 - Sviluppatore PHP |
![]() |
![]() |
![]() |
#30 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Ma ti e' richiesto di crearti tu i semafori ?
Non ti sarebbe piu' semplice utilizzare le chiamate che ti forniscono le librerie ? |
![]() |
![]() |
![]() |
#31 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Tu non puoi implementare wait e signal...devi usare quelle fornite dal sistema operativo perchè devono essere atomiche !!! |
|
![]() |
![]() |
![]() |
#32 |
Senior Member
Iscritto dal: Dec 1999
Messaggi: 139
|
paplo cazzarola non ci siamo. Devi usare le chiamate di sistema.
Togli le definizioni di wait e signal e includi le librerie di sistema che le implementano. Nel tuo file sorgente non devono comparire queste righe: Codice:
void wait(semaphore s); void signal(semaphore s); void wait(semaphore s) { if ((*s)==0) exit(1); //ovvero lo schedule mi mette in //coda dei processi bloccati sul semaforo s --(*s); } void signal(semaphore s) { ++(*s); }
__________________
Ingegnere: colui che ha molta familiarità con i modelli e molto poca con le modelle. |
![]() |
![]() |
![]() |
#33 |
Member
Iscritto dal: Mar 2001
Città: Pordenone
Messaggi: 73
|
vi ringrazio per la pazienza.
appena posso vi riferiro il risultato!
__________________
Età : 28 - Sviluppatore PHP |
![]() |
![]() |
![]() |
#34 | |
Member
Iscritto dal: Mar 2001
Città: Pordenone
Messaggi: 73
|
Quote:
"Gli esercizi proposti nel seguito devono essere realizzati in C utilizzando, laddove è necessario, le chiamate di sistema e le funzioni di libreria del caso. " così è molto più facile! ![]() (un'altra volta sono stato costretto a creare un metodo Random in java perchè il professore non voleva che utilizassimo quello della libreria Math) Ciao, Paplo
__________________
Età : 28 - Sviluppatore PHP |
|
![]() |
![]() |
![]() |
#35 | |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#36 | |
Member
Iscritto dal: Mar 2001
Città: Pordenone
Messaggi: 73
|
Quote:
__________________
Età : 28 - Sviluppatore PHP |
|
![]() |
![]() |
![]() |
#37 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
![]() Te l'ho detto...fidati... Ti può funzionare 10 volte, 100 volte, 1000 volte...ma sicuramente, per Murphy, ti andrà male proprio quando ti serve veramente !!! Tutte le primitive di sincronizzazione DEVONO essere atomiche...o per lo emno devono appoggiarsi ad una primitiva di sincronizzazione atomica (ad esempio si possono implementare la wait e la signal con una mutex)...punto e basta...non ci sono alternative... Altrimenti le puoi provare ad implementare come ti pare, ma saranno sempre errate... |
|
![]() |
![]() |
![]() |
#38 |
Member
Iscritto dal: Mar 2001
Città: Pordenone
Messaggi: 73
|
Ciao,
ho provato ad utilizzare le funzioni atomiche, ma mi da cmq. errori ... filosofi.c:19: warning: initialization makes pointer from integer without a cast filosofi.c: In function `main': filosofi.c:45: warning: assignment makes pointer from integer without a cast filosofi.c: In function `put_cards': filosofi.c:135: warning: passing arg 1 of `signal' makes integer from pointer without a cast filosofi.c:135: too few arguments to function `signal' filosofi.c:136: warning: passing arg 1 of `signal' makes integer from pointer without a cast filosofi.c:136: too few arguments to function `signal' putroppo non riesco a risolverli! ![]() ![]() Ancora grazie per la disponibilità. Ciao, Paplo. P.S.:il listato è ...
__________________
Età : 28 - Sviluppatore PHP |
![]() |
![]() |
![]() |
#39 |
Member
Iscritto dal: Mar 2001
Città: Pordenone
Messaggi: 73
|
Ciao,
qualcuno mi suggerisce come inizializzare i semafori. Grazie 1000, Paplo.
__________________
Età : 28 - Sviluppatore PHP |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:32.