You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优先级队列中用户对象比较运算符异常致程序崩溃求助

排查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:39:54