2016-09-29 4 views
-1

Ich habe eine Klasse, die einen Semaphor enthält. Bei Ausführung der Klassen run-Methode. Es erstellt einen Thread und übergibt eine Funktion und einen Objektzeiger meiner Klasse. Die Funktion versuchte dann, auf das Objekt und den Semaphor innerhalb von diesem zuzugreifen und warte ab. Aber der Compiler lässt mich das nicht machen.Fehler beim Warten auf Semaphor

Fehler:

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 

Methode übergeben auf 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; 
    } 

Basisausführung von Knoten und Kanten Klassen

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

alle Tipps und Empfehlungen würden mir gefallen .. Ich versuche C++ zu lernen, während ich diese Aufgabe mache, so dass mein Code für Sie seltsam aussehen könnte. – Qubit

+0

Stattdessen verwenden Sie C++ Standard-Synchronisationsmechanismen wie eine [Bedingung Variable] (http://en.cppreference.com/w/cpp/thread/condition_variable) –

+0

@ πάνταῥεῖ Verwendung von Semaphoren in dieser Zuordnung obligatorisch: \ – Qubit

Antwort

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

Ihr in Klasse Mitglied ist:

std::vector<MyEdge*> in; 

Daher ist in[i] ein MyEdge *.

Als solche für den Zugriff auf seine sem Mitglied, sollte dies sein:

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

Die anderen Kompilierungsfehlern ist das gleiche Problem.

+1

@John Nun, wir werden alle bekommen, was wir verdienen in Bezug auf unser Handeln :) (sagt ein bekennender Buddhist) –

+0

@ πάνταῥεῖ: Du meinst, du bist dazu verdammt unfair zu Tode betrogen zu werden, mit der falschen doppelten Frage? –

+0

@LightnessRacesinOrbit Das ist eine Sache, die leicht von anderen Dupehammer-Besitzern oder vom Community-Konsens gelöst werden kann. Ich glaube nicht wirklich, dass es meine _karma_ beeinflussen wird;). –