我有一個包含信號量的類。執行類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