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();
};
}
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
Stattdessen verwenden Sie C++ Standard-Synchronisationsmechanismen wie eine [Bedingung Variable] (http://en.cppreference.com/w/cpp/thread/condition_variable) –
@ πάνταῥεῖ Verwendung von Semaphoren in dieser Zuordnung obligatorisch: \ – Qubit