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

C++多线程:检测最先返回结果的线程并获取返回值

问题:检测最先完成的异步线程并获取结果

需求详情

我用两个线程(为简化场景仅保留2个)通过内部逻辑生成结果66并返回,需要监听哪个线程最先返回该值。线程基于std::async实现,返回值通过std::future传递。程序原本尝试用while循环持续检查两个线程的状态,以此获取最先完成的线程结果并用于后续计算。

核心目标

  • 准确检测两个线程中最先返回值66的那个
  • 一旦有线程返回66(无论另一个线程是否完成),立即将该值传入main()进行简单算术运算
  • 后续完成的线程返回的66不参与任何计算

现有问题

当前程序始终输出rf1是最先完成的线程,哪怕function1的逻辑远慢于function2(比如function1含1000次循环,function2仅10次),推测存在阻塞行为。

后来修改了while循环的等待逻辑,还给function1和function2添加了差异化逻辑:function1执行98次循环,function2执行100次循环,但程序仍持续输出function2最先完成,问题未解决。

初始尝试代码

#include <future>
#include <iostream>
#include "unistd.h"

double function1() {
    // Logic to retrieve _value
    // ...
    double _value = 66;
    return _value;
}

double function2() {
    // Logic to retrieve _value
    // ...
    double _value = 66;
    return _value;
}

int main() {
    double ret_value = 0;
    auto rf1 = std::async(std::launch::async, function1);
    auto status1 = rf1.wait_for(std::chrono::nanoseconds(1));
    auto rf2 = std::async(std::launch::async, function2);
    auto status2 = rf2.wait_for(std::chrono::nanoseconds(1));
    while (true) {
        if (status1 == std::future_status::ready) {
            std::cout << "RF1 FINISHED FIRST" << std::endl;
            ret_value = rf1.get();
            break;
        }
        else if (status2 == std::future_status::ready) {
            std::cout << "RF2 FINISHED FIRST" << std::endl;
            ret_value = rf2.get();
            break;
        }
        else if (status1 != std::future_status::ready) {
            status1 = rf1.wait_for(std::chrono::nanoseconds(1));
        }
        else if (status2 != std::future_status::ready) {
            status2 = rf2.wait_for(std::chrono::nanoseconds(1));
        }
    }
    double some_value = ret_value + 40;
    return 0;
}

修改后的代码

#include <future>
#include <iostream>
#include "unistd.h"

double function1() {
    // Logic to retrieve _value
    for (int i = 0; i < 98; i++) {
        std::cout << std::endl;
    }
    double _value = 66;
    return _value;
}

double function2() {
    // Logic to retrieve _value
    for (int i = 0; i < 100; i++) {
        std::cout << std::endl;
    }
    double _value = 66;
    return _value;
}

int main() {
    double ret_value = 0;
    auto rf1 = std::async(std::launch::async, function1);
    auto status1 = rf1.wait_for(std::chrono::nanoseconds(1));
    auto rf2 = std::async(std::launch::async, function2);
    auto status2 = rf2.wait_for(std::chrono::nanoseconds(1));
    while (true) {
        if (status1 == std::future_status::ready) {
            std::cout << "RF1 FINISHED FIRST" << std::endl;
            ret_value = rf1.get();
            break;
        }
        else if (status2 == std::future_status::ready) {
            std::cout << "RF2 FINISHED FIRST" << std::endl;
            ret_value = rf2.get();
            break;
        }
        status1 = rf1.wait_for(std::chrono::nanoseconds(1));
        status2 = rf2.wait_for(std::chrono::nanoseconds(1));
    }
    double some_value = ret_value + 40;
    return 0;
}

疑问

Q1. 能否修改程序以准确检测最先返回的线程,将其返回值66用于main()的后续计算?
Q2. 当前while循环是否引入了阻塞行为?


内容的提问来源于stack exchange,提问作者p.luck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:05:28