View Full Version : [C] - Programmazione concorrente
spideylover
19-01-2008, 10:10
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:
#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");
}
Salvate il file in semthread.c
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
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/pthreads/uguide/users-78.htm
Ovviamente leggi anche quella delle altre funzioni.
spideylover
20-01-2008, 16:06
Ciao ragazzi l'appuntamento della consegna è stato spostato il 25!!!! Che :ciapet: grazie a dio!!! comunque ho provato a buttare giù una cosa del genere:
#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)
Cos'è sta storia? Non riesco a capire che cosa intende per segmentation fault.....
Grazie a chi mi aiuta a capire da cosa è dovuto questo errore e interruzione del programma...
Ciao Ciao e BUona DOmenica!!!!
maulattu
20-01-2008, 17:51
Ciao ragazzi l'appuntamento della consegna è stato spostato il 25!!!! Che :ciapet: grazie a dio!!! comunque ho provato a buttare giù una cosa del genere:
#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)
Cos'è sta storia? Non riesco a capire che cosa intende per segmentation fault.....
Grazie a chi mi aiuta a capire da cosa è dovuto questo errore e interruzione del programma...
Ciao Ciao e BUona DOmenica!!!!
Ciao,
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 :asd:
spideylover
20-01-2008, 21:29
Ciao,
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 :asd:
Quindi era solo quello l'errore? Sicuro?
L'hai provato? Io lo provo....Mi sento così insicura....boh adesso vedrò speriam bene....se no :cry: :cry: :cry:
Mi spieghi cosa sono le SPALATE che si trovano nel codice, mentre nel testo non c'è alcun riferimento ?
spideylover
21-01-2008, 08:29
beh mi sono sbagliata a lasciarlo perchè ne dovevo fare un'altro prima di questo provandolo con i monitor (ma da lo stesso errore :stordita: ) ....e allora senza riscrivere tutto il codice l'ho copiato tutto e poi modificato. COmunque sia non
:mc: sento che non ce la farò....domani ho l'esame di programmazione in C....e entro il 25 è la consegna dell'elaborato...non riesco a fare tutto tutto...vedrò di dedicare il tempo a programmazione
spideylover
21-01-2008, 08:50
ringrazio vivamente con un mega bacio alla francese a maulattu!!!!!!! Grazie Grazie Grazie!!!!!!!!!!!!!! Che :doh: 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!!!:read:
spideylover
21-01-2008, 08:57
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.....
beh mi sono sbagliata a lasciarlo perchè ne dovevo fare un'altro prima di questo provandolo con i monitor
Però non c'è solo il define, lo usi anche nel codice facendo fare tre cicli dentro al thread.
maulattu
21-01-2008, 18:35
ringrazio vivamente con un mega bacio alla francese a maulattu
grazie :asd:
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.....
Già... è passato a miglior vita nel luglio del 2006... era tanto bellino e coccolone :cry:
http://www.hwupgrade.it/forum/showthread.php?t=1238758
Fine OT :stordita:
spideylover
22-01-2008, 11:48
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
spideylover
23-01-2008, 21:42
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..:cry: :cry: :cry: :cry: e poi :banned: plz :help: :help: :help: :help: :help: :help: :help:
spideylover
24-01-2008, 15:27
:mad:
banryu79
24-01-2008, 15:57
Come è andata? :rolleyes:
esprimo un significativo ROLLEYES: --> :rolleyes:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.