2016-09-29 43 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_;)。 –