pthread_create(&tid, NULL, &func, &valoreintero);
....
void *func(void *arg){
int val = *(int *) arg;
}
Qui ci vedevo ancora il problema.
Ma nel codice che mi hai scritto tu, no!
Effettivamente se salvi ogni i, in una struttura unica per il thread... non c'è nessun problema.
Grazie
Ho battuto molto sul primo esempio, insistendo che per me c'è condition code, per via di questo programma. Il cui risultato è che per tutti i 3 thread i = 0.
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>
#include <time.h>
#define N 3
#define TIMETHINKING 5
#define TIMEEATING 10
#define BEGIN -1
#define THINKING 0
#define HUNGRY 1
#define EATING 2
#define END 3
pthread_mutex_t MutexTavolo = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t Filosofo[N] = PTHREAD_COND_INITIALIZER;
static int status_filos[N];
void stamp_status(int id){
int i;
printf("Status (%d) : [",id);
for(i = 0; i < N; i++){
printf("%d",status_filos[i]);
if(i != (N-1)) printf(", ");
else printf("];\n");
}
}
void *filos(void *arg){
int i,timeoperation;
i = *(int *) arg;
srand(time(NULL));
/*FASE THINKING*/
pthread_mutex_lock(&MutexTavolo);
status_filos[i] = THINKING;
stamp_status(i);
pthread_mutex_unlock(&MutexTavolo);
timeoperation = rand()%TIMETHINKING + 1;
sleep(timeoperation);
pthread_mutex_lock(&MutexTavolo);
/*FASE HUNGRY*/
status_filos[i] = HUNGRY;
stamp_status(i);
while( (status_filos[(i-1)%N] == EATING) || (status_filos[(i+1)%N] == EATING) )
pthread_cond_wait(&Filosofo[i],&MutexTavolo);
/*FASE EATING*/
status_filos[i] = EATING;
stamp_status(i);
pthread_mutex_unlock(&MutexTavolo);
timeoperation = rand()%TIMEEATING + 1;
sleep(timeoperation);
/*FASE ENDING*/
pthread_mutex_lock(&MutexTavolo);
status_filos[i] = END;
stamp_status(i);
if( (status_filos[(i-1)%N] == HUNGRY) && (status_filos[(i-2)%N] != EATING) )
pthread_cond_signal(&Filosofo[(i-1)%N]);
if( (status_filos[(i+1)%N] == HUNGRY) && (status_filos[(i+2)%N] != EATING) )
pthread_cond_signal(&Filosofo[(i+1)%N]);
pthread_mutex_unlock(&MutexTavolo);
pthread_exit( (void *) 17);
}
int main(){
int i;
pthread_t tid[N];
for(i = 0; i < N; i++)
status_filos[i] = BEGIN;
stamp_status(-1);
for(i = 0; i < N; i++){
printf("The philospher %d sits down on the table.\n",i);
pthread_create(&tid[i], NULL, &filos, &i);
}
for(i = 0; i < N; i++){
pthread_join(tid[i], NULL);
printf("The philospher %d rises from the table.\n",i);
}
return 0;
}