我有一个包含信号量的类。执行类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();
};
}
任何提示和建议,将不胜感激..我试图学习C++,而做这个任务,所以我的代码可能看起来很奇怪。 – Qubit
宁可使用C++标准同步机制,如[条件变量](http://en.cppreference.com/w/cpp/thread/condition_variable) –
@πάνταῥεῖ在此作业中强制使用信号量:\ – Qubit