2016-09-29 42 views
-1

我有一個包含信號量的類。執行類run方法。它創建一個線程並傳遞我的類的一個函數和一個對象指針。該函數然後試圖訪問它內部的對象和信號量並調用wait。但編譯器不讓我這樣做。嘗試等待信號量時出錯

錯誤:

myNode.cpp: In function 'void* MyProjectGraph::compute(void*)': 
myNode.cpp:70: error: request for member 'sem' in 'node->MyProjectGraph::MyNode::in.std::vector<_Tp, _Alloc>::operator[] [with _Tp = MyProjectGraph::MyEdge*, _Alloc = std::allocator<MyProjectGraph::MyEdge*>](((long unsigned int)i))', which is of non-class type 'MyProjectGraph::MyEdge*' 
myNode.cpp:82: error: request for member 'sem' in 'node->MyProjectGraph::MyNode::in.std::vector<_Tp, _Alloc>::operator[] [with _Tp = MyProjectGraph::MyEdge*, _Alloc = std::allocator<MyProjectGraph::MyEdge*>](((long unsigned int)i))', which is of non-class type 'MyProjectGraph::MyEdge*' 
myNode.cpp:87: error: request for member 'sem' in 'node->MyProjectGraph::MyNode::out.std::vector<_Tp, _Alloc>::operator[] [with _Tp = MyProjectGraph::MyEdge*, _Alloc = std::allocator<MyProjectGraph::MyEdge*>](((long unsigned int)i))', which is of non-class type 'MyProjectGraph::MyEdge*' 
make: *** [myNode.o] Error 1 

方法對在pthread_create傳遞

void *compute(void *ptr){ 
     MyNode* node = (MyNode*)ptr; 
     time_t end; 

     cout<<"Node Running: "<<node->ltr<<endl; 

     //wait on all incoming edges 
     for(int i = 0; i < node->in.size();i++){ 
      sem_wait(&(node->in[i].sem)); 
      //node->in[i].edgeWait(); 
     } 

     sleep(node->time); 
     sem_wait(&count_sem); 
     graphCount += node->value; 
     sem_post(&count_sem); 
     time(&end); 

     //destory dependent semaphores 
     for(int i = 0; i < node->in.size();i++){ 
      sem_destroy(&(node->in[i].sem));   
     } 

     //post all outgoing edges 
     for(int i = 0; i < node->out.size();i++){ 
      sem_post(&(node->out[i].sem)); 
      //node->out[i].edgePost();   
     } 

     printf("Node %c computed a value of %d after %.2lf second.",node->ltr,node->value,difftime(end,start)); 
     pthread_exit(NULL); 
     return 0; 
    } 

節點和邊緣類的基本設計

class MyNode{ 
     public: 
      int tid; 
      int value; 
      int time; 
      char ltr; 

      pthread_t thread; 

      std::vector<MyEdge*> in; 
      std::vector<MyEdge*> out; 

      MyNode(); 
      MyNode(char ltr, int val, int time); 
      void addInEdge(MyEdge* edge); 
      void addOutEdge(MyEdge* edge); 
      void run(); 
      void signalEdges(); 
      void waitEdges(); //Implementation is not known atm 
      void toString(); 
    }; 

class MyEdge{ 
     public: 
      MyNode* in; 
      MyNode* out; 

      sem_t sem; 

      MyEdge(int init, MyNode* in, MyNode* out); 
      int edgeWait(); 
      int edgePost();  
    }; 
} 
+0

任何提示和建議,將不勝感激..我試圖學習C++,而做這個任務,所以我的代碼可能看起來很奇怪。 – Qubit

+0

寧可使用C++標準同步機制,如[條件變量](http://en.cppreference.com/w/cpp/thread/condition_variable) –

+0

@πάνταῥεῖ在此作業中強制使用信號量:\ – Qubit

回答

2
sem_wait(&(node->in[i].sem)); 

in類成員是:

std::vector<MyEdge*> in; 

因此,in[i]MyEdge *

因此,訪問其sem成員,這應該是:

sem_wait(&(node->in[i]->sem)); 

其他編譯錯誤是同樣的問題。

+1

@John好吧,我們都會得到我們應得的關於我們的行爲:)(說一個認罪的佛教徒) –

+0

@πάνταῥεῖ:你的意思是你註定被不公平地死亡,錯誤的重複問題? –

+0

@LightnessRacesinOrbit這是一件可以被其他dupehammer持有者或社區共識輕鬆解決的事情。我真的不認爲這會影響我的_karma_;)。 –