你好,我在我的代碼中的下一個問題:從投大小不同的整數指針投地從整型指針不同大小-wint到指針鑄
」 -wint到指針-cast」
這個問題在這行代碼
pthread_create(&filos[i], NULL, (void *)filosofos,(void *) i);
具體地,在(無效*)1
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#define N 5 //num. de filosofos
#define IZQ (i-1)%N //vecino izquierdo de i
#define DER (i+1)%N //vecino derecho de i
#define PENSANDO 0
#define CON_HAMBRE 1
#define COME 2
pthread_t filos[N]; //hilos que representan a los filósofos
sem_t mutex ; //semáforo para la sección crítica
sem_t s[N]; //semáforos para los filósofos
int estado [N] ; //estado actual de cada filósosfo
/*
el filosofo i va a perder el tiempo... (va a pensar)
*/
void pensar (int i)
{
int t ;
t = rand() % 11;
printf("Filosofo %d pensando \n", i) ;
estado[i] = PENSANDO;
sleep (t) ;
}
/*
El filosofo i, va a comer !!!!!!!!
*/
void comer (int i)
{
printf("Filósofo %d esta comiendo un caballo \n", i);
estado[i] = COME;
sleep (5);
}
/*
Verifica que pueda tomar ambos tenedores
*/
void verifica(int i)
{
if(estado[i]==CON_HAMBRE && estado[IZQ]!=COME && estado[DER]!=COME){
estado[i] = COME;
printf("Filósofo %d comiendo\n", i) ;
sem_post(&s[i]);
}
}
/*
El filosofo i intenta tomar los tenedores
*/
void toma_tndrs(int i)
{
sem_wait(&mutex); //entra a la sección crítica, hace uso del semaforo
estado[i] = CON_HAMBRE; //dice: tengo mucha hambre!!!!!!!!!!
verifica(i); // verifica que pueda tomar los tenedores
sem_post(&mutex); //sale de la sección crítica y el sem. puede permitir la entrada a alguien más
sem_wait(&s[i]); //se bloquea si no consiguió los tenedores
}
/*
el filosofo i dejará los tenedores
*/
void deja_tndrs(int i)
{
sem_wait(&mutex); // de nuevo entra a la sección critica
estado[i] = PENSANDO; //deja de comer y se pone a pensar
verifica(IZQ);
verifica(DER);
sem_post(&mutex);
}
/*
*/
void * filosofos (int i)
{
int j ;
for (; ;)
{
pensar(i) ;
toma_tndrs(i) ;
comer(i) ;
deja_tndrs(i) ;
}
}
main()
{
int i ;
for(i = 0; i < 5; i++){
sem_init (&s[i], 0, 1);
estado[i] = PENSANDO ;
}
sem_init (&mutex, 0, 1);
//creamos un hilo de ejecucion para cada filosofo, que ejecuta filosofos()
for (i=0; i<N; i++)
pthread_create(&filos[i], NULL, (void *)filosofos,(void *) i);
//cada hilo espera a que terminen los demás y libera los recursos
for (i=0; i<N; i++){
pthread_join(filos[i],NULL);
}
}
「int」可能與「void *」的大小不同,如果指針曾經被引用過,那麼這種轉換可能是不安全的。你應該傳遞一個指向'int'值的指針,來表示它。或者使用'intptr_t'。 – ktb
在理解基本C之前,你不應該嘗試去執行線程。 – Stargateur
@Evert *你正在將整數i轉換爲void:'(void *)i'的指針。你應該把指針指向i:'(void *)&i' *。將'i'的地址傳遞給一個子線程會產生一個競爭條件 - 'i'的值可能會隨着孩子的時間而改變線程訪問它。 –