所以基本上我有一个静态映射将我的struct映射到队列,但是当我尝试推送到队列时,它无法推送任何东西。
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 :(得分: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;
// ^^^^^^^^^^^^^^^