PDA

View Full Version : [c] problema compèilazione con pthread


19spike83
05-02-2008, 13:02
Salve ragazzi , ho un problema a compilare un esercizio in c , sono neofita in linux , ho guardato in giro i commenti per gli errori ma non riesco a scapparci fuori , forse mancano le librerie ??
quali librerie mancano ?? posix ?? come faccio a installarle ??

ci sarebbe un modo di compilare tutto sotto windows con microsof visual strudio ??
con visual studio mi dice quando compilo : Cannot open include file: 'semaphore.h': No such file or directory

compilando con gcc sotto ubuntu , faccio
gcc file.c

warning: no newline at end of file
/tmp/ccKWOzjo.o: In function `coordinatore':
monitor.c:(.text+0x2c4): undefined reference to `pthread_create'
monitor.c:(.text+0x31a): undefined reference to `pthread_join'
monitor.c:(.text+0x347): undefined reference to `pthread_create'
monitor.c:(.text+0x39f): undefined reference to `pthread_create'
monitor.c:(.text+0x3e6): undefined reference to `pthread_join'
monitor.c:(.text+0x3f8): undefined reference to `pthread_join'
collect2: ld returned 1 exit status


altrimenti ho provato

gcc file.c -o file -lpthread

warning : no newline at end of file


questo è il file che devo compilare :
Come mi devo comportare ??

Mi basterebbe riuscire a compilarlo e dopo lo adatterei alle mie esigenze ............
Grazie per qualsiasi aiuto.

#include <stdio>
#include <stdlib>
#include <windows>
#include <pthread>
#include <semaphore>

#define MAX_SPALATORI 5 //SPALATORI
#define MAX_PALE 2 //PALE
#define MAX_GUANTI 5 //GUANTI sempre in numero pari

#define RALLENTA 40000000 //variabile per rallentare
#define SPALATE 3

pthread_mutex_t prendi,rilascia; //mutex per acquisire o 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 guanti; //semafori inizializzati a G
sem_t pale; //semafori inizializzati a P

void attesa();


void *spalatore(void *arg)
{
int i;
//while(1)
for(i=0; i<SPALATE; i++)
{

pthread_mutex_lock(&mutex);

printf("\nSpalatore n. %d :bevo il caffe\'\n.",arg); //BEVE IL CAFFE
attesa();

pthread_mutex_unlock(&mutex);

pthread_mutex_lock(&prendi);
sem_wait(&guanti); //afferra il guanto destro
sem_wait(&guanti); //afferra il guanto sinistro
sem_wait(&pale); //afferra la pala
pthread_mutex_unlock(&prendi);

pthread_mutex_lock(&mutex);

printf("\nSpalatore n. %d : Ho preso guanti e pala!! vado a spalare la neve\n",arg); //FA QUALCOSA (spala la neve)
attesa();

pthread_mutex_unlock(&mutex);


pthread_mutex_lock(&rilascia);
sem_post(&guanti); //rilascia il guanto destro
sem_post(&guanti); //rilascia il guanto sinistro
sem_post(&pale); //rilascia la pala
pthread_mutex_unlock(&rilascia);
}
return NULL;
}




void main()
{
char i;
void* ret;
pthread_t spalatori[MAX_SPALATORI];
pthread_mutex_init(&mutex,NULL); //INIZIALIZZO I SEMAFORI
pthread_mutex_init(&prendi,NULL);
pthread_mutex_init(&rilascia,NULL);
sem_init(&guanti,0,MAX_GUANTI);
sem_init(&pale,0,MAX_PALE);

attesa();
printf(" ORE 7:30\n\nGli spalatori sono arrivati nel cortile e vanno tutti a prendersi un caffe\'\n\n");
attesa();
printf("Ci sono %d spalatori, %d pale e %d paia di guanti\n\n", MAX_SPALATORI, MAX_PALE+1, MAX_GUANTI+1);
attesa();

for (i=0;i<MAX_SPALATORI;i++) //CREO I THREAD
{
if (pthread_create(&spalatori[i], NULL, spalatore, (void*)i)<0)
{
fprintf(stderr,"ERRORE!!");
exit(1);
}
}

for (i=0;i<MAX_SPALATORI;i++)
{
pthread_join(spalatori[i],&ret);
}

/*
pthread_mutex_destroy(&mutex); // DISTRUGGO TUTTI I SEMAFORI
pthread_mutex_destroy(&prendi);
pthread_mutex_destroy(&rilascia);
sem_destroy(&guanti);
sem_destroy(&pale);

////////////////////inizia il pomeriggio//////////////////////////////////

pthread_mutex_init(&mutex,NULL); //INIZIALIZZO I SEMAFORI
pthread_mutex_init(&prendi,NULL);
pthread_mutex_init(&rilascia,NULL);
sem_init(&guanti,0,MAX_GUANTI-1);
sem_init(&pale,0,MAX_PALE-1);
*/


for (i=0; i<MAX_SPALATORI; i++)
{
attesa();
printf("\nSpalatore n. %d :bevo il caffe\'\n.",i);
}
attesa();
printf("\n ORE 12.00\n\nPausa Pranzo, gli spalatori se ne vanno in mensa\n");
attesa();
printf("\n ORE 14.00\n\nEcco gli spalatori di ritorno, ora un caffe\' e poi al lavoro!!\n");
attesa();

for (i=0;i<MAX_SPALATORI;i++) //CREO I THREAD
{
if (pthread_create(&spalatori[i], NULL, spalatore, (void*)i)<0)
{
fprintf(stderr,"ERRORE!!");
exit(1);
}
}
for (i=0;i<=MAX_SPALATORI;i++)
{
pthread_join(spalatori[i],&ret);
}



for (i=0; i<MAX_SPALATORI; i++)
{
attesa();
printf("\nSpalatore n. %d :bevo il caffe\'\n.",i);
}

printf("\n ORE 17.00\n\nOTTIMO LAVORO!!\n\n La giornata e\' finita... gli spalatori se ne tornano a casa!!\n\n");
system("pause");

pthread_mutex_destroy(&mutex); // DISTRUGGO TUTTI I SEMAFORI
pthread_mutex_destroy(&prendi);
pthread_mutex_destroy(&rilascia);
sem_destroy(&guanti);
sem_destroy(&pale);

}


void attesa()
{
int j;
for(j=0; j<RALLENTA; j++) // ciclo per rallentare la visione in output
{
}
}

AnonimoVeneziano
05-02-2008, 13:42
gcc file.c -o file -lpthread

warning : no newline at end of file




A me sembra che qua ha funzionato

Manca solo il newline alla fine del file , ma è ignorabilissimo...

19spike83
05-02-2008, 17:47
scusate infatti ora mi funziona .... chissa cosa sbagliavo.... bho...

Adesso vedo di modificarlo come mi serve , se ho qualche problema magari scrivo qui.

Grazie :)

banryu79
06-02-2008, 08:09
E' già il secondo esercizio in C sui thread che vedo con 'sti benedetti "Spalatori", ma che è, un classico della materia?
Questi vanno pure a bersi il caffè :asd:

19spike83
06-02-2008, 12:01
in effetti è vero ci guardavo pure io ....
Si bevono un caffè e spalano ahahhha.

Son i soliti esercizi che si danno....spalatori , ippodromo , ecc ecc

Ho dei problemini con la coda circolare ... mi vca fuori dalla coda se faccio ripetere continuamente il ciclo.....spero di risolvere sta roba mi fà perdere la testa...