Mon objectif est d'obtenir des extrants du programme Dining Philosophers C. J'utilise Visual Studio 2013 sur Windows 7 pour compiler et exécuter des programmes C. Des erreurs ont été signalées indiquant que pthread.h, semaphore.h n'étaient pas disponibles. Téléchargé la même chose pour Windows Build et inclus dans le projet.avertissement C4013: 'sommeil' indéfini; supposant extern retournant int
Maintenant je les 8 erreurs suivantes
avertissement C4013: 'sommeil' non définie; en supposant extern retour int
erreur LNK2019: symbole externe non résolu __imp__sem_init référencé en fonction _main
erreur LNK2019: symbole externe non résolu __imp__sem_wait référencé en fonction _put_fork
erreur LNK2019: symbole externe non résolu __imp__sem_post référencé dans function _put_fork
erreur LNK2019: symbole externe non résolu __imp__pthread_create référencé dans functio n _main
erreur LNK2019: symbole externe insoluble __imp__pthread_join référencé en fonction _main
erreur LNK2019: symbole externe insoluble _sleep référencé dans fonction _philospher
erreur LNK1120: 6 externes non résolus
Le code que j'ai utilisé est
#include<stdio.h>
#include<semaphore.h>
#include<pthread.h>
#define N 5
#define THINKING 0
#define HUNGRY 1
#define EATING 2
#define LEFT (ph_num+4)%N
#define RIGHT (ph_num+1)%N
sem_t mutex;
sem_t S[N];
void * philospher(void *num);
void take_fork(int);
void put_fork(int);
void test(int);
int state[N];
int phil_num[N] = { 0, 1, 2, 3, 4 };
int main()
{
int i;
pthread_t thread_id[N];
sem_init(&mutex, 0, 1);
for (i = 0; i<N; i++)
sem_init(&S[i], 0, 0);
for (i = 0; i<N; i++)
{
pthread_create(&thread_id[i], NULL, philospher, &phil_num[i]);
printf("Philosopher %d is thinking\n", i + 1);
}
for (i = 0; i<N; i++)
pthread_join(thread_id[i], NULL);
}
void *philospher(void *num)
{
while (1)
{
int *i = num;
sleep(1);
take_fork(*i);
sleep(0);
put_fork(*i);
}
}
void take_fork(int ph_num)
{
sem_wait(&mutex);
state[ph_num] = HUNGRY;
printf("Philosopher %d is Hungry\n", ph_num + 1);
test(ph_num);
sem_post(&mutex);
sem_wait(&S[ph_num]);
sleep(1);
}
void test(int ph_num)
{
if (state[ph_num] == HUNGRY && state[LEFT] != EATING && state[RIGHT] != EATING)
{
state[ph_num] = EATING;
sleep(2);
printf("Philosopher %d takes fork %d and %d\n", ph_num + 1, LEFT + 1, ph_num + 1);
printf("Philosopher %d is Eating\n", ph_num + 1);
sem_post(&S[ph_num]);
}
}
void put_fork(int ph_num)
{
sem_wait(&mutex);
state[ph_num] = THINKING;
printf("Philosopher %d putting fork %d and %d down\n", ph_num + 1, LEFT + 1, ph_num + 1);
printf("Philosopher %d is thinking\n", ph_num + 1);
test(LEFT);
test(RIGHT);
sem_post(&mutex);
}`
Comment avez-vous installé pthreads sur VSE? –
Avez-vous ajouté des dépendances à Linker dans les propriétés? Le sommeil n'est pas défini aussi, achetez le chemin, j'utilise Sleep() de windows.h –
'pthreads' est spécifique à POSIX. Vous ne pouvez pas simplement récupérer une copie du fichier d'en-tête et vous attendre à ce qu'il fonctionne sur Windows. –