2013-05-17 49 views
0

我想解決就餐哲學家問題。所以我幾乎做了整個代碼,但問題是我不能初始化監視器(我已經制作了僞代碼,我用C++重新編寫)如此真的我無法測試該程序。任何人都可以幫助我說明monitor/mutex_init的初始化有什麼問題嗎?餐飲哲學家和互斥體初始化

我得到錯誤第18行,它是這樣: 錯誤:爲不同類型的符號

其更改爲INT調用pthread_mutex_init(&顯示器,NULL)的「廉政調用pthread_mutex_init」重新聲明; 將無法​​正常工作!

加入 int pthread_mutex_init(pthread_mutex_t * monitor,NULL);

我得到錯誤:「__null」

#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; 
} 

回答

1

刪除行

int pthread_mutex_init(*monitor,NULL); 

,而是做

pthread_mutex_init(&monitor,NULL); 

在您的主要功能的開始。 (並檢查它返回0)

因爲它是你在聲明函數不調用它,因爲它已經宣佈你得到一個錯誤

+0

這是正確的,但不是 調用pthread_mutex_init(*監視器,NULL); 我把主要 調用pthread_mutex_init (&monitor,NULL); 它的工作。TNX! – T0plomj3r

+0

那麼,正是我之前寫的... – Maresh

0

此功能需要一個指向前預期的標識,爲什麼你把「INT」呼叫前?我認爲你混淆了一個原型(這是不必要的)和實際的函數調用。

int pthread_mutex_init(*monitor,NULL); 

所以:

pthread_mutex_init(&monitor,NULL); 

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

+0

嘗試都在這裏張貼在此之前,沒有運氣... – T0plomj3r

+0

好了,反正此行是完全錯誤的,關於指針「*監測」只會導致段錯誤我它實際上編譯。爲什麼「int」?爲什麼你想要再次對函數進行初始化? – Maresh

+0

,因爲沒有這個int之前我得到: 錯誤:預期的構造函數,析構函數或類型轉換之前「(」令牌 – T0plomj3r