|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jan 2008
Messaggi: 11
|
[C] - Programmazione concorrente
Ciao bellissimi!!! Sono una ragazza che sta entrando nel mondo della programmazione. Conosco molto bene il C sotto Unix infatti uso Ubuntu 7.10 Gutsy Gibson. QUello che vorrei è se c'è qualcuno che è bravo in S.O. questa è una materia molto interessante ma sono in una montagna di merda......perchè entro il 22 mi sono accorta che dovevo svolgere da ieri fino al 22 quest'elaborato....mi sono sentita 0....non ho capito bene il concetto di semafori e monitor o meglio non ho capito come implementarli. Ho cercato su internet ma nulla di implementation in C. Potreste darmi una mano per favore?
La prof non è un granchè e non ci ha fornito nessun esempio neanche uno su come svolgere l'elaborato. Infatti ci ha spiegato come funzionano i semafori....e ci ha detto di usare i semafori con thread e monitor con thread....come si implementano? Chi mi può dare una dritta. Intanto vi allego il testo. Ho trovato anche questo codice ma non so se modificandolo potrebbe andar bene per il progetto..... eccolo qui: Codice:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
#include <pthread.h>
static sem_t s1,s2;
void *thread1(void *arg)
{
int i;
for (i=0;i<10;i++)
{
sem_wait(&s1);
printf("Ping\n");
sem_post(&s2);
}
printf("t1 exit\n");
pthread_exit(0);
}
void *thread2(void *arg)
{
int i;
for (i=0;i<10;i++)
{
sem_wait(&s2);
printf("Pong\n");
sem_post(&s1);
}
printf("t2 exit\n");
pthread_exit(0);
}
int main()
{
pthread_t tid1,tid2;
void *ret;
sem_init(&s1,0,1);
sem_init(&s2,0,0);
if (pthread_create(&tid1,NULL,thread1,NULL) <0)
{
fprintf(stderr,"pthread_create error for thread 1\n");
exit(1);
}
if (pthread_create(&tid2,NULL,thread2,NULL) <0)
{
fprintf(stderr,"pthread_create error for thread 2\n");
exit(1);
}
pthread_join(tid1,&ret);
pthread_join(tid2,&ret);
printf("Exit\n");
}
gcc -o semafori semthread.c -lpthread (Linkaggio librerire del pthread in UNix) e vedrete che Padre e Figlio giocano a ping pong.....questo l'ho capito ma come si fa a svolgere il progetto? VI supplico di aiutarmi....sono veramente preoccupata di non farcela....grazie ciao ciao |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
I monitor in teoria non ci sono, almeno nella implementazione più diffusa dei meccanismi di concorrenza su Linux.
Esistono però le condition che sono la struttura di sincronizzazione che più si avvicina ai monitor: in pratica le condition lavorano su una mutex, prima di chiamare una wait su una condition bisogna acquisire la rispettiva mutex. Eseguendo la wait si rilascia la mutex permettendo ad altri thread in attesa su quella mutex di lavorare. La condition garantisce che i thread che si bloccano su una data condition vengano risvegliati quando avviene una signal sulla condition con la proprietà della mutex. Qui una spiegazione più dettagliata della wait: http://cs.pub.ro/~apc/2003/resources...e/users-78.htm Ovviamente leggi anche quella delle altre funzioni. |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Jan 2008
Messaggi: 11
|
io c'ho provato ma mi va in...
Ciao ragazzi l'appuntamento della consegna è stato spostato il 25!!!! Che
grazie a dio!!! comunque ho provato a buttare giù una cosa del genere:Codice:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define NUM_AIUTANTI 5 //aiutanti
#define NUM_SLITTE 2 //slitte
#define NUM_RENNE 5 //renne sempre in numero pari
#define SPALATE 3
pthread_mutex_t prendi; //mutex per acquisire i 2 tipi di risorse in mutua esclusione
pthread_mutex_t rilascia; //mutex per rilasciare i 2 tipi di risorse in mutua esclusione
pthread_mutex_t mutex; //mutex utilizzato UNICAMENTE per l'accesso in mutua esclusione al buffer di output (per mantenere formattato l'output)
sem_t renne; //semafori inizializzati a G
sem_t slitte; //semafori inizializzati a P
void *aiutante(void *arg)
{
int i;
for(i=0; i<SPALATE; i++)
{
pthread_mutex_lock(&mutex);
printf("\naiutante n. %d :bevo il caffe\'\n.",arg); //BEVE IL CAFFE
sleep(1);
pthread_mutex_unlock(&mutex);
pthread_mutex_lock(&prendi);
sem_wait(&renne); //afferra il guanto destro
sem_wait(&renne); //afferra il guanto sinistro
sem_wait(&slitte); //afferra la slitta
pthread_mutex_unlock(&prendi);
pthread_mutex_lock(&mutex);
printf("\naiutante n. %d : Ho preso renne e slitta!! vado a slittare\n",arg); //FA QUALCOSA (slitta)
sleep(1);
pthread_mutex_unlock(&mutex);
pthread_mutex_lock(&rilascia);
sem_post(&renne); //rilascia il guanto destro
sem_post(&renne); //rilascia il guanto sinistro
sem_post(&slitte); //rilascia la slitta
pthread_mutex_unlock(&rilascia);
}
pthread_exit(NULL);
}
int main()
{
int i,creazione;
void* ret;
pthread_t aiutanti[NUM_AIUTANTI];
pthread_mutex_init(&mutex,NULL); //INIZIALIZZO I SEMAFORI
pthread_mutex_init(&prendi,NULL);
pthread_mutex_init(&rilascia,NULL);
sem_init(&renne,0,NUM_RENNE);
sem_init(&slitte,0,NUM_SLITTE);
sleep(1);
printf(" ORE 7:30\n\nGli aiutanti sono arrivati nel cortile e vanno tutti a prendersi un caffe\'\n\n");
sleep(1);
printf("Ci sono %d aiutanti, %d slitte e %d paia di renne\n\n", NUM_AIUTANTI, NUM_SLITTE+1, NUM_RENNE+1);
sleep(1);
for (i=1;i<NUM_AIUTANTI+1;i++) //CREO I THREAD
{
creazione = pthread_create(&aiutanti[i],NULL,aiutante,(void*)i);
if (creazione)
{
printf("Error;return code from pthread_create() Is %d\n",creazione);
exit(-1);
}
}
for (i=1;i<NUM_AIUTANTI+1;i++)
{
pthread_join(aiutanti[i],&ret);
}
for (i=1; i<NUM_AIUTANTI+1; i++)
{
sleep(1);
printf("\naiutante n. %d :bevo il caffe\'\n.",i);
}
sleep(1);
printf("\n ORE 12.00\n\nPausa Pranzo, gli aiutanti se ne vanno in mensa\n");
sleep(1);
printf("\n ORE 14.00\n\nEcco gli aiutanti di ritorno, ora un caffe\' e poi al lavoro!!\n");
sleep(1);
for (i=1;i<NUM_AIUTANTI+1;i++) //CREO I THREAD
{
creazione = pthread_create(&aiutanti[i],NULL,aiutante,(void*)i);
if (creazione)
{
printf("Error;return code from pthread_CReate() Is %d\n",creazione);
exit(-1);
}
}
for (i=1;i<NUM_AIUTANTI+1;i++)
{
pthread_join(aiutanti[i],&ret);
}
for (i=1; i<NUM_AIUTANTI+1; i++)
{
sleep(1);
printf("\naiutante n. %d :bevo il caffe\'\n.",i);
}
printf("\n ORE 17.00\n\nOTTIMO LAVORO!!\n\n La giornata e\' finita... gli aiutanti se ne tornano a casa!!\n\n");
sleep(5);
pthread_mutex_destroy(&mutex); // DISTRUGGO TUTTI I SEMAFORI
pthread_mutex_destroy(&prendi);
pthread_mutex_destroy(&rilascia);
sem_destroy(&renne);
sem_destroy(&slitte);
pthread_exit(NULL);
}
Ho provato a compilarlo. Ma dopo un pò mi va in Segmentation Fault(CORe dumped) che vuol dire? Non mi è mai capitata una roba simile...
Allora provate anche voi per credere:
:read:
1) prendete il codice
2) salvatelo in aiutanti.c
3) sotto linux compilatelo con il comando gcc -o prova aiutanti.c -lptread
Funziona un pò stranamente ma fino ad un certo punto va in segmentation fault (core dumped)
Grazie a chi mi aiuta a capire da cosa è dovuto questo errore e interruzione del programma... Ciao Ciao e BUona DOmenica!!!! |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
|
Quote:
in C (e anche C++) devi fare mooooolta attenzione all'uso degli indici degli array. ci sono array definiti come pthread_t aiutanti[NUM_AIUTANTI]; cioè composti da NUM_AIUTANTI "celle" che vanno da 0 a NUM_AIUTANTI - 1. L'errore che hai commesso è nei cicli for che vanno da 1 a NUM_AIUTANTI. Devi farli partire da 0 e farli terminare a NUM_AIUTANTI - 1. Ti dà il segmentation fault xkè il tuo programma ha sfondato in un'area di memoria non di sua competenza, alché il kernel è arrivato è gli ha spezzato le gambine
__________________
Ciao ciao cagnolino Billy MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen. XBOX Live GamerTag: InsaneMau |
|
|
|
|
|
|
#5 | |
|
Junior Member
Iscritto dal: Jan 2008
Messaggi: 11
|
Quote:
Quindi era solo quello l'errore? Sicuro? L'hai provato? Io lo provo....Mi sento così insicura....boh adesso vedrò speriam bene....se no |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Mi spieghi cosa sono le SPALATE che si trovano nel codice, mentre nel testo non c'è alcun riferimento ?
|
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Jan 2008
Messaggi: 11
|
beh
beh mi sono sbagliata a lasciarlo perchè ne dovevo fare un'altro prima di questo provandolo con i monitor (ma da lo stesso errore
) ....e allora senza riscrivere tutto il codice l'ho copiato tutto e poi modificato. COmunque sia nonUltima modifica di spideylover : 21-01-2008 alle 09:32. |
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Jan 2008
Messaggi: 11
|
si è vero
ringrazio vivamente con un mega bacio alla francese a maulattu!!!!!!! Grazie Grazie Grazie!!!!!!!!!!!!!! Che
che sono! Non ci avevo fatto caso......e poi i cicli però volevo partire da 1 perchè se no che centra aiutante 0?Per cionci...lascia stare bada a chiudere il topic!!!
|
|
|
|
|
|
#9 |
|
Junior Member
Iscritto dal: Jan 2008
Messaggi: 11
|
EHm maulattu ehm bello l'avatar ma ho la sensazione che sia andato in Paradiso vero....povero cagnolino è anche così bello....mi dispiace per te....io ne ho uno bianco maltese che anche lui è vecchietto e mi dispiace molto che gli fa male tutte le ossette....si chiama Pepe....ciao ciao e grazie dell'aiuto.....
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#11 | ||
|
Senior Member
Iscritto dal: Mar 2005
Città: ~
Messaggi: 740
|
Quote:
![]() Quote:
http://www.hwupgrade.it/forum/showthread.php?t=1238758 Fine OT
__________________
Ciao ciao cagnolino Billy MacMini late 2009, 2.53GHz, 4GB ram, 320GB hard disk, Snow Leopard 10.8.2 - iPod Nano 6th gen. XBOX Live GamerTag: InsaneMau |
||
|
|
|
|
|
#12 |
|
Junior Member
Iscritto dal: Jan 2008
Messaggi: 11
|
si ma il programma sembra non funzionare come dovrebbe. Sono in tilt. NOn capisco più niente. Oggi mi sono fatta prendere dalla paura per l'esame e credo di averlo bucato....comunque....non ho ben capito forse o meglio non ho ben implpementato bene i due elaborati...potreste darmi una mano urgente....in questi 2 giorni? VI chiedo solo una mano....non di +...grazie...
In allegato ci sono gli spalatori e il testo originale degli spalatori ce come vedrete è simile a quello che dovrei fare. Il testo vel lo posto dopo sono di corsa per il treno |
|
|
|
|
|
#13 |
|
Junior Member
Iscritto dal: Jan 2008
Messaggi: 11
|
Il testo è uguale a quello di babbonatale ma solo che al posto degli spalatori in quelli dell'allegato. Grazie
Ciao Ciao Bellissimi sono triste....c'è solo domani.. plz
|
|
|
|
|
|
#14 |
|
Junior Member
Iscritto dal: Jan 2008
Messaggi: 11
|
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Come è andata?
|
|
|
|
|
|
#16 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
esprimo un significativo ROLLEYES: -->
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:08.











grazie a dio!!! comunque ho provato a buttare giù una cosa del genere:
) ....e allora senza riscrivere tutto il codice l'ho copiato tutto e poi modificato. COmunque sia non
che sono! Non ci avevo fatto caso......e poi i cicli però volevo partire da 1 perchè se no che centra aiutante 0?
plz








