无法推送到由静态映射<结构创建的队列,队列>

unable to push to queue created by static map<struct, queue>

本文关键字:队列 创建 结构 gt lt 静态 映射      更新时间:2023-10-16

基本上我有一个静态映射将我的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;
}
}

在我尝试推到队列的函数中,我立即测试队列,看看它是否为空,并且它总是显示为空。我怀疑这可能与映射是静态的,队列没有正确初始化的事实有关,但我似乎无法修复它。

你有两个独立的,不幸的是同名的对象:

map_type ThreadManager::threadsWaitingOnConditions;

map_type threadsWaitingOnConditions;

你把两者混淆了。最后的检查应该是:

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

之类的。考虑到静态成员map是私有的,您可能应该只写

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

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

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