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

多线程Boost.Beast Kraken WebSocket客户端IOContext运行异常求助

问题定位与解决方案

核心问题分析

1. 主线程提前退出,未等待工作线程完成

你的run_threads_in_cores函数启动线程后,主线程直接继续执行甚至退出,导致IOContext对象被销毁,工作线程中的WebSocket客户端操作还未启动就终止,因此没有控制台输出。手动实现时你可能显式调用了thread.join(),但封装函数里遗漏了这一步。

2. IOContext传递方式错误

如果run_event_loop函数接收的是IOContext的值传递而非引用/指针,会产生与原对象无关的拷贝对象,原对象的异步任务不会被执行,拷贝对象的run()因无任务直接返回,线程立即结束。

3. CPU亲和性设置可能存在逻辑错误

绑定核心时若索引超出可用核心范围(6核对应索引0-5),或设置亲和性的代码有误,会导致线程无法正常调度,IOContext的run()无法处理任务。

修正后的代码实现

1. 修正run_event_loop函数

确保传递IOContext的引用,同时保证客户端对象在IOContext运行期间存活:

void run_event_loop(boost::asio::io_context& ioc, const std::string& pair) {
    // 初始化Kraken WebSocket客户端,绑定当前IOContext
    KrakenWsClient client(ioc, pair);
    client.connect(); // 启动连接与消息监听

    // 运行IOContext,直到所有异步任务完成
    ioc.run();
}

2. 修正run_threads_in_cores函数

添加线程等待逻辑,避免主线程提前退出,同时正确设置CPU亲和性:

#include <thread>
#include <vector>
#include <pthread.h>

void set_thread_affinity(std::thread& t, int core_id) {
    cpu_set_t cpuset;
    CPU_ZERO(&cpuset);
    CPU_SET(core_id, &cpuset);
    pthread_setaffinity_np(t.native_handle(), sizeof(cpu_set_t), &cpuset);
}

void run_threads_in_cores() {
    std::vector<std::thread> threads;
    std::vector<boost::asio::io_context> iocs(2); // 为每个交易对创建独立IOContext

    // 为AUD/USD绑定核心0
    threads.emplace_back(run_event_loop, std::ref(iocs[0]), "AUD/USD");
    set_thread_affinity(threads.back(), 0);

    // 为AUD/JPY绑定核心1
    threads.emplace_back(run_event_loop, std::ref(iocs[1]), "AUD/JPY");
    set_thread_affinity(threads.back(), 1);

    // 等待所有工作线程完成
    for (auto& t : threads) {
        if (t.joinable()) {
            t.join();
        }
    }
}

3. 客户端代码注意事项

  • 确保KrakenWsClient的connect()方法正确发起异步连接,并启动异步读操作(如async_read),若没有异步任务,IOContext的run()会立即返回,线程直接结束。
  • 异步回调中要保证客户端对象的引用/指针有效,避免悬空引用导致的异常。

补充说明

休眠1秒后出现操作取消与段错误,是因为主线程休眠期间IOContext对象被销毁,工作线程中的异步操作访问了已销毁的对象,进而触发段错误;操作取消则是IOContext被提前停止导致的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:22:46