2011-10-09 2 views
-2

에 의해 생성 된 대기열로 푸시 할 수 없습니다. 기본적으로 구조체를 대기열에 매핑하는 정적지도가 있습니다. 그러나 대기열로 밀어 넣으려고하면 아무 것도 푸시하지 못합니다. 내가 큐에 밀어하려고하는 기능에 정적 맵 <struct, queue>

struct SignalID_t { 
    unsigned int lock; 
    unsigned int cond; 

    SignalID_t(unsigned int lock_, unsigned int cond_):lock(lock_), cond(cond_) {} 
}; 

class SignalIDComp { 
public: 
bool operator()(const SignalID_t& a, const SignalID_t& b) const 
    {return a.lock == b.lock && a.cond == b.cond;} 
}; 

class ThreadManager{ 
public: 

static std::queue<ucontext_t *>& waitingQ(SignalID_t id) 
    {return threadsWaitingOnConditions[id];} 

private: 
    static std::map<SignalID_t, std::queue<ucontext_t*>> threadsWaitingOnConditions; 
} 

map<SignalID_t, queue<ucontext_t *>, SignalIDComp> ThreadManager::threadsWaitingOnConditions; 

class Threads{ 

void thread_wait(int lock, int cond){ 
    SignalID_t id(lock, cond); 
    ThreadManager::waitingQ(id).push(ThreadManager::getRunningThread()); 
    if (ThreadManager::waitingQ(id).empty()) 
     cout << "failed to push thread to cond waiting Q" << endl; 
} 
} 

, 나는 즉시 비어이고 항상 cout을 그것입니다 있는지 확인하기 위해 큐를 테스트합니다. 나는 그것이 맵이 정적이고 큐가 제대로 초기화되지 않는다는 사실과 관련이 있다고 생각하지만, 그것을 고칠 수는 없다.

+0

이 실제 코드가 아닙니다 : 클래스 정의는 세미콜론으로 종료되어야한다, ThreadManager :: getRunningThread()도 존재하지 않는다. 실제 코드를 게시하십시오. –

답변

1

당신은 두 개의 별도, 불행하게도 동일 이름의 개체가 :

map_type ThreadManager::threadsWaitingOnConditions; 

map_type threadsWaitingOnConditions; 

당신은 두 가지를 혼동하고 있습니다. 최종 수표는 다음과 같아야합니다 :

if (ThreadManager::threadsWaitingOnConditions[id].empty()) { /* ... */ } 

또는 그와 유사한 것. 정적 멤버 맵이 private 인 것을 감안할 때, 아마도

if (ThreadManager::waitingQ(id).empty()) { /* ... */ } 

당신은 글로벌 맵 객체에 대해 무엇이 필요한지 이해할 수 없습니다. 불필요한 것 같습니다. 또는 오히려, 당신은 아마 당신이 이런 식으로 작성해야하는 경우에 정의 정적 구성원 개체의, 할 말은 :

map<SignalID_t, std::queue<ucontext_t*>> ThreadManager::threadsWaitingOnConditions; 
//          ^^^^^^^^^^^^^^^ 
+0

아, 죄송합니다.하지만 대부분의 경우 코드를 복사하여 붙여 넣는 대신 수동으로 코드를 다시 작성한다는 사실이 반영되었습니다. 나는 그 질문의 현재 상태가 그러한 변화의 대부분을 반영한다고 믿으며, 여전히 추진은 실패한다. – MattB

+0

그래,'ThreadManager :: getRunningThread()'함수가 없으므로 현재 코드를 컴파일해서는 안된다. 실제 오류와 무엇이 오류인지를 구분하는 것은 불가능하기 때문에, 나는 반 기억 된 의사 코드보다는 실제 코드를 게시하도록 요청해야합니다. –

관련 문제