0

我正在尝试解决哲学家进餐问题。所以我几乎编写了整个代码,但问题是我无法初始化监视器(我已经制作了我用 C++ 重写的伪代码)所以我真的无法测试程序. 谁能帮我说说 monitor/mutex_init 的初始化有什么问题?

我在第 18 行收到错误,它类似于:错误:'int pthread_mutex_init' redeclared as different kind of symbol

将其更改为 int pthread_mutex_init(&monitor,NULL); 不行!

通过添加 int pthread_mutex_init(pthread_mutex_t *monitor, NULL);

我收到错误:“__null”之前的预期标识符</p>

#include <iostream>
#include <cstdio>
#include <pthread.h>
#include <cstdlib>
#include <unistd.h>

using namespace std;


char v_filozofi[5]={'O'};   //vizualni prikaz filozofa
int stapic[5]={1};          //stapici za filozofe
int broj[5];                //shema koju sam mora sloziti da imam broj filozofa

pthread_t       d_filozofi[5]; //dretve filozofa,philosopher's thread
pthread_cond_t  red_uvjeta[5];  
pthread_mutex_t monitor;        //deklariramo monitor,tj mymutex

int pthread_mutex_init(*monitor,NULL);

void ispisi_stanje(int n){
    for(int i = 0; i < 5 ;i++)  cout<< v_filozofi[i];
    cout<<"("<< n+1 << ")" <<endl;  
}

void misliti(int n){
    cout<<"Mislim " << endl;
    sleep(4);
}

void jesti(int n){
    pthread_mutex_lock(&monitor);
        v_filozofi[n]='o';
        while(stapic[n]==0 || stapic[n+1]%5==0){//gleda ima li lijevi i desni
        //stapic na raspolaganju
            pthread_cond_wait(&red_uvjeta[n],&monitor);
        }
        stapic[n] = stapic[(n+1)%5] = 0;
        v_filozofi[n] = 'X';

        ispisi_stanje(n);

    pthread_mutex_unlock(&monitor);
    sleep(2);
    pthread_mutex_lock(&monitor);
        v_filozofi[n] = 'O';

        stapic[n] = stapic[(n+1)%5] = 1; 

        pthread_cond_signal(&red_uvjeta[(n-1)%5]);
        pthread_cond_signal(&red_uvjeta[(n+1)%5]);

        ispisi_stanje(n);
    pthread_mutex_unlock(&monitor);


}

void * filozof(void *n){
    int br_fil = *((int *)n);
    while(1){
        misliti(br_fil);
        jesti(br_fil);
    }   
return 0;
}   

//MAIN  
int main(){
for(int i=0;i<5;i++){
    broj[i] = i;
    pthread_cond_init(&red_uvjeta[i],NULL);
    }
for(int i=0;i<5;i++){
    sleep(1);
    pthread_create( &d_filozofi[i],NULL,filozof,&broj[i]);
    }

for(int i=0;i<5;i++) pthread_join(d_filozofi[i],NULL);
pthread_mutex_destroy(&monitor);

return 0;
}
4

3 回答 3

1

删除线

int pthread_mutex_init(*monitor,NULL);

而是做

pthread_mutex_init(&monitor,NULL); 

在你的主要功能的开始。(并检查它是否返回 0)

因为它是你声明的函数没有调用它,并且因为它已经声明了你得到一个错误

于 2013-05-17T12:03:10.537 回答
0

这个函数需要一个指针,为什么你在调用前加上“int”?我认为您混淆了原型(这是不必要的)和对该函数的实际调用。

int pthread_mutex_init(*monitor,NULL);

所以:

pthread_mutex_init(&monitor,NULL);

http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_mutex_init.html

于 2013-05-17T11:50:34.460 回答
0

看看这个很好

http://nitish712.blogspot.in/search/label/mutex

http://nitish712.blogspot.in/2012/09/classical-ipc-problems.html

于 2013-05-31T17:09:17.807 回答