bertoz85
23-02-2006, 11:42
Spero che mi riusciate a dare una mano per questo esercizio del cavolo che devo fare epr un esame .... :muro:
Si tratta di un problema di concorrenza da risolvere con i semafori e thread posix (pthread, semget, etc....)
Ho installato cygwin (non ho linux e non ditemi di metterlo per sto esame :muro: ) e scritto il seguente codice:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#define N 10 // numero di thread
int semid;
int stato = LIBERO;
pthread_t tr[N];
[...] // dichiarazioni varie
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
[...] // funzioni varie
void *funz_thread(void *ptr)
{
printf("Thread %d entra\n", *(int*) ptr);
sleep(5);
printf("Thread %d esce\n", *(int*) ptr);
}
int main()
{
int i;
union semun arg, dealloc;
unsigned short values[3];
int numthread[N];
key_t semkey;
// ALLOCAZIONE E INIZIALIZZAZIONE SEMAFORI
semkey = ftok("/cygdrive/d/Programmi/UNIVERSITA\'/SO/Progetto/Es1/es1.cpp", 1000);
semid = semget(semkey, 3, IPC_CREAT | 0660);
values[0] = 0;
values[1] = 0;
values[2] = 0;
arg.array = values;
int j = semctl(semid,0,SETALL,&arg);
printf("Semid %d\nj %d",semid,j);
// INIZIALIZZAZIONE THREAD
for (i=0; i<N; i++)
numthread[i] = i+1;
for (i=0; i<N; i++)
pthread_create( &tr[i], NULL, funz_thread, (void*)&numthread[i]);
// ATTESA DEI THREAD
for (i=0; i<N; i++)
pthread_join( tr[i], NULL);
// DEALLOCAZIONE SEMAFORI
semctl(semid,1,IPC_RMID,dealloc);
return 0;
}
si compila, però quando lo eseguo mi dà "Bad system call" ed esce!! :cry:
se commento tutta la parte dell'inizializzazione dei semafori allora funziona, i thread partono e escono.
altrimenti dà sto errore, penso in semget dato che se metto prima la printf allora stampa e poi dà errore, altrimenti da solo errore e stop :muro: :mad:
ovviamente controllare errno dopo semget non vale, dato che dopo l'errore il programma esce direttamente senza eseguire ....
cos'ho sbagliato??? :cry: :cry: :cry: l'ordine degli include, sempre che cambi qualcosa?
forse devo settare qualche variabile visto che è cygwin e forse nn è 100% compatibile?
ciao e aiutatemi!!!!!!! :cry:
grazie
Si tratta di un problema di concorrenza da risolvere con i semafori e thread posix (pthread, semget, etc....)
Ho installato cygwin (non ho linux e non ditemi di metterlo per sto esame :muro: ) e scritto il seguente codice:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#define N 10 // numero di thread
int semid;
int stato = LIBERO;
pthread_t tr[N];
[...] // dichiarazioni varie
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
[...] // funzioni varie
void *funz_thread(void *ptr)
{
printf("Thread %d entra\n", *(int*) ptr);
sleep(5);
printf("Thread %d esce\n", *(int*) ptr);
}
int main()
{
int i;
union semun arg, dealloc;
unsigned short values[3];
int numthread[N];
key_t semkey;
// ALLOCAZIONE E INIZIALIZZAZIONE SEMAFORI
semkey = ftok("/cygdrive/d/Programmi/UNIVERSITA\'/SO/Progetto/Es1/es1.cpp", 1000);
semid = semget(semkey, 3, IPC_CREAT | 0660);
values[0] = 0;
values[1] = 0;
values[2] = 0;
arg.array = values;
int j = semctl(semid,0,SETALL,&arg);
printf("Semid %d\nj %d",semid,j);
// INIZIALIZZAZIONE THREAD
for (i=0; i<N; i++)
numthread[i] = i+1;
for (i=0; i<N; i++)
pthread_create( &tr[i], NULL, funz_thread, (void*)&numthread[i]);
// ATTESA DEI THREAD
for (i=0; i<N; i++)
pthread_join( tr[i], NULL);
// DEALLOCAZIONE SEMAFORI
semctl(semid,1,IPC_RMID,dealloc);
return 0;
}
si compila, però quando lo eseguo mi dà "Bad system call" ed esce!! :cry:
se commento tutta la parte dell'inizializzazione dei semafori allora funziona, i thread partono e escono.
altrimenti dà sto errore, penso in semget dato che se metto prima la printf allora stampa e poi dà errore, altrimenti da solo errore e stop :muro: :mad:
ovviamente controllare errno dopo semget non vale, dato che dopo l'errore il programma esce direttamente senza eseguire ....
cos'ho sbagliato??? :cry: :cry: :cry: l'ordine degli include, sempre che cambi qualcosa?
forse devo settare qualche variabile visto che è cygwin e forse nn è 100% compatibile?
ciao e aiutatemi!!!!!!! :cry:
grazie