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

std::sort排序失效:修改XMRIG Proxy源码实现Worker按字母排序失败

XMRIG Proxy Worker列表排序失效问题修复

问题背景

修改XMRIG Proxy源码,希望在xmrig::Workers::printWorkers方法中让Worker列表按字母顺序打印。已尝试复制m_workers到临时容器pr_workers,调用std::sort并以Worker::name()作为排序依据,但排序功能未生效。

相关代码片段:

auto pr_workers=m_workers;
std::sort(pr_workers.begin(), pr_workers.end(), [](const Worker a, const Worker b) {
    return a.name() < b.name();
});

完整printWorkers方法代码:

void xmrig::Workers::printWorkers()
{
    if (!isEnabled()) {
        LOG_ERR("Per worker statistics disabled");

        return;
    }

    char workerName[24] = { 0 };
    size_t size = 0;

    Log::print(WHITE_BOLD_S "%-23s | %-15s | %-5s | %-8s | %-3s | %11s | %11s |",
               "WORKER NAME", "LAST IP", "COUNT", "ACCEPTED", "REJ", "10 MINUTES", "24 HOURS");

    auto pr_workers=m_workers;
    std::sort(pr_workers.begin(), pr_workers.end(), [](const Worker a, const Worker b) {
        return a.name() < b.name();
    });

    for (const Worker &worker : pr_workers) {
        const char *name = worker.name();
        size = strlen(name);

        if (size > sizeof(workerName) - 1) {
            if (m_mode == Agent) {
                memcpy(workerName, name, 20);
                memcpy(workerName + 20, "...", 3);
            }
            else {
                memcpy(workerName, name, 6);
                memcpy(workerName + 6, "...", 3);
                memcpy(workerName + 9, name + size - sizeof(workerName) + 10, sizeof(workerName) - 10);
            }
        }
        else {
            strncpy(workerName, name, sizeof(workerName) - 1);
        }

        Log::print("%-23s | %-15s | %5" PRIu64 " | %8" PRIu64 " | %3" PRIu64 " | %6.2f kH/s | %6.2f kH/s |",
                   workerName, worker.ip(), worker.connections(), worker.accepted(), worker.rejected(), worker.hashrate(600), worker.hashrate(86400));
    }
}

问题原因

排序逻辑存在两个关键问题:

  • C风格字符串比较错误:Worker::name()返回的是const char*类型,直接使用<运算符比较的是指针的内存地址,而非字符串的字典序,导致排序逻辑完全不符合预期。
  • 不必要的拷贝:lambda表达式中使用值传递const Worker a, const Worker b,会触发Worker对象的拷贝构造,不仅效率低下,还可能因拷贝行为导致意外问题。

修复方案

修改排序的lambda表达式,修正字符串比较逻辑并使用引用传递参数:

方案1:使用std::strcmp比较C风格字符串

auto pr_workers = m_workers;
std::sort(pr_workers.begin(), pr_workers.end(), [](const Worker& a, const Worker& b) {
    // std::strcmp返回值<0表示a的名字字典序小于b
    return std::strcmp(a.name(), b.name()) < 0;
});

方案2:转换为std::string后比较(可读性更好)

auto pr_workers = m_workers;
std::sort(pr_workers.begin(), pr_workers.end(), [](const Worker& a, const Worker& b) {
    return std::string(a.name()) < std::string(b.name());
});

验证说明

修改后重新编译XMRIG Proxy,调用Worker列表打印功能时,Worker将按照名称的字典序(字母顺序)排列输出。

内容的提问来源于stack exchange,提问作者aeon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:33:38