优先级队列中用户对象比较运算符异常致程序崩溃求助
排查C++ priority_queue引发的"invalid operator <"崩溃问题
嘿,我来帮你搞定这个崩溃问题!你的程序之所以会触发"invalid operator <"错误并崩溃,核心原因是qThreadCompare比较器没有满足C++标准库对**严格弱序(Strict Weak Ordering)**的强制要求,这会导致std::priority_queue的内部逻辑出现未定义行为。
问题出在比较器逻辑
先看你写的比较器代码:
struct qThreadCompare { bool operator()(const qThreadDetails & lhs, const qThreadDetails & rhs) const { if(lhs.m_availableTime < rhs.m_availableTime ) { if (lhs.m_uiThreadId < rhs.m_uiThreadId) { return false; } } if (lhs.m_availableTime < rhs.m_availableTime ) { return false; } return true; } };
这段代码有三个致命问题:
- 逻辑混乱且重复:两次判断
lhs.m_availableTime < rhs.m_availableTime,完全没必要,还容易搞混逻辑。 - 场景覆盖不全:当两个线程的空闲时间相等时,没有对线程ID做正确比较,导致优先级无法区分。
- 违反严格弱序规则:
std::priority_queue的比较器需要明确判断「lhs是否应该排在rhs之后」,你的返回值逻辑完全颠倒,同时破坏了严格弱序的自反性、传递性要求。
正确的比较器实现
根据你的需求(优先选更早空闲的线程,空闲时间相同则选ID更小的线程),我们需要重新实现符合规则的比较器:
struct qThreadCompare { bool operator()(const qThreadDetails & lhs, const qThreadDetails & rhs) const { // 规则:空闲时间小的优先级更高;时间相同则线程ID小的优先级更高 // 返回true意味着lhs优先级更低,会被放到堆的下层 if (lhs.m_availableTime != rhs.m_availableTime) { return lhs.m_availableTime > rhs.m_availableTime; } else { return lhs.m_uiThreadId > rhs.m_uiThreadId; } } };
简单解释下:
- 如果
lhs的空闲时间比rhs大,说明它更晚才能处理新任务,优先级更低,返回true让它排在后面。 - 当空闲时间相同时,
lhs的线程ID更大,优先级更低,同样返回true。 - 这个实现完全符合严格弱序的所有要求,不会再触发未定义行为。
额外的小检查
修复比较器后,你还可以确认下输入读取是否正确:你的测试输入是4 20后跟20个1,要确保第一行正确读取线程数n=4和任务数m=20,第二行把20个任务时长正确存入m_vecJobTimes中。
另外,你初始化线程的循环逻辑(i < m_uiNoOfThreads && uiVecStartTimesIdx < m_vecJobTimes.size())是没问题的,不会出现越界访问。
内容的提问来源于stack exchange,提问作者venkysmarty
相关产品推荐
相关产品推荐

