2014-07-17 2 views
0

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); 
}` 
+0

Comment avez-vous installé pthreads sur VSE? –

+0

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 –

+0

'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. –

Répondre

1

Il est trop tard, mais aujourd'hui j'ai aussi fait face à ce problème. Problème: I can't use pthread in window platform. Solution: trouver une autre variante de pthreadVC2.lib dans C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ lib (pour moi c'était x86 au lieu de x64)

Questions connexes