0
votes

My Goal is to get outputs from Dining Philosophers C Program. I am using Visual Studio 2013 on Windows 7 to compile and execute C programs. Got errors stating that pthread.h, semaphore.h were not available. Downloaded the same for windows build and included in the project.

Now I get the following 8 errors

warning C4013: 'sleep' undefined; assuming extern returning int

error LNK2019: unresolved external symbol __imp__sem_init referenced in function _main

error LNK2019: unresolved external symbol __imp__sem_wait referenced in function _put_fork

error LNK2019: unresolved external symbol __imp__sem_post referenced in function _put_fork

error LNK2019: unresolved external symbol __imp__pthread_create referenced in function _main

error LNK2019: unresolved external symbol __imp__pthread_join referenced in function _main

error LNK2019: unresolved external symbol _sleep referenced in function _philospher

error LNK1120: 6 unresolved externals

The Code I have used is`

#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);
}`
1
How did you install pthreads on VSE?Ivan Ivanov
Did you add dependencies to Linker in Properties? Sleep is not defined too, buy the way, I use Sleep() from windows.hIvan Ivanov
pthreads is specific to POSIX. You can't just grab a copy of the header file and expect it to work on Windows.Keith Thompson
Dear Ivan Ivanov, I have downloaded from sourceware.org/pub/pthreads-win32/sources/…Stanish Arul Jagan
Dear Ivan Ivanov, Please help me in adding dependencies to Linker in Properties. Also help me define sleep. Please also help me in finding the windows.h suitable for windows7Stanish Arul Jagan

1 Answers

1
votes

It is too late, but today I faced this problem too. Problem: I can't use pthread in window platform. Solution: find another variant of pthreadVC2.lib in C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib (for me it was x86 instead of x64)