2011-10-09 9 views
-2

创建的队列所以基本上我有一个静态地图,我的结构映射到队列,但是当我尝试推入队列时,它无法推送任何东西。无法推送到由静态地图<结构,队列>

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()) { /* ... */ } 

或类似的情况。鉴于静态会员地图是私人的,你应该说,

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

我不明白你需要什么与全球地图对象。这似乎没有必要。或者说,你很可能意味着它是定义静态成员对象的,在这种情况下,你应该写这样的:

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

对此感到遗憾,但其中大部分是我手动重新创建代码而不是复制和粘贴代码的反映。我相信问题的当前状态反映了这些变化中的大部分,并且仍然无法工作。 – MattB

+0

好的,你的当前代码甚至不应该编译,因为你没有函数'ThreadManager :: getRunningThread()'。但是,我应该要求你从你的工作中发布真实的代码,而不是半记忆的伪代码,因为不可能将真正的错误和表示错误分开。 –