无法推送到由静态映射<结构创建的队列,队列>
unable to push to queue created by static map<struct, queue>
基本上我有一个静态映射将我的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;
// ^^^^^^^^^^^^^^^
相关文章:
- 在C++中创建队列 - 什么是 malloc 错误?
- 避免使用 boost::进程间::消息队列创建文件
- 是否可以使用简单队列创建优先级队列
- C++ Poco - 如何创建通知队列的向量?
- 如何在 c++ 中创建对的优先级队列.这会弹出具有最小值的元素.默认的弹出最大值
- 如何使用用户输入创建字符串队列?
- 使用加速进程间创建消息队列 - 内存访问冲突
- 为什么我不能在 Windows 中的 rabbitmq 中创建队列?
- 为队列创建C 全局变量
- 创建多类队列C++
- C 在标题文件中创建具有结构定义的结构的队列
- 我有一个问题,创建了C 中阻塞队列的向量
- 无法创建支持传输队列的 VkDevice
- 关于使用我自己创建的类使用优先级队列的问题
- 从调度队列块 [ swift / c++ ] 创建线程
- 在.c文件接收函数中使用Linux中的MSGGET创建消息队列未实现错误
- 尝试使用堆栈创建队列.为什么我会遇到int转换错误的空白
- 用管道在C++中创建调度队列/线程处理程序:FIFO溢出
- 从 STL 优先级队列创建最小堆
- boost::进程间消息队列创建时的竞争条件