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
相关产品推荐
相关产品推荐

