在HPX中,如何在获取所需任务结果后取消其他hpx::future的等待?
HPX中提前终止并行任务的实现方案
要实现“某任务完成且结果符合需求时取消其他任务”的需求,可结合HPX的when_any接口、任务取消机制来完成,具体步骤如下:
1. 用hpx::when_any监听首个完成的任务
hpx::when_any可以等待一组hpx::future中第一个完成的实例,拿到结果后即可判断是否符合需求,进而触发后续取消操作。它会返回一个包含已完成future和剩余未完成future列表的pair。
2. 确保任务支持取消
HPX任务默认不会主动响应取消请求,需要在任务内部添加取消检查点:
- 调用
hpx::this_thread::interruption_point():该函数会在收到取消请求时抛出hpx::task_canceled异常,直接终止任务。 - 或手动检查
hpx::this_thread::is_interruption_requested():返回true时自行处理终止逻辑(比如提前返回)。
3. 取消剩余任务
对剩余未完成的hpx::future调用cancel()方法发起取消请求,配合任务内的检查点即可终止任务执行。如果不需要等待任务完全终止,也可直接丢弃,但建议处理取消以避免资源浪费。
完整示例代码
#include <hpx/hpx.hpp> #include <hpx/future.hpp> #include <vector> #include <iostream> // 支持取消的任务函数 hpx::future<int> cancellable_task(int task_id, int duration_ms) { return hpx::async([task_id, duration_ms]() { // 模拟耗时任务,每10ms检查一次取消状态 for (int i = 0; i < duration_ms / 10; ++i) { // 取消检查点:收到请求则抛出异常终止任务 hpx::this_thread::interruption_point(); hpx::this_thread::sleep_for(std::chrono::milliseconds(10)); } std::cout << "Task " << task_id << " finished, result: " << task_id << "\n"; return task_id; }); } int main() { hpx::init(); std::vector<hpx::future<int>> tasks; // 创建不同耗时的并行任务 tasks.emplace_back(cancellable_task(1, 500)); tasks.emplace_back(cancellable_task(2, 200)); tasks.emplace_back(cancellable_task(3, 800)); tasks.emplace_back(cancellable_task(4, 100)); tasks.emplace_back(cancellable_task(5, 300)); // 等待第一个完成的任务 auto [completed_fut, remaining_futs] = hpx::when_any(tasks); int result = completed_fut.get(); // 判断结果是否符合需求(示例中以结果为4作为目标) if (result == 4) { std::cout << "Desired result obtained: " << result << ", canceling remaining tasks...\n"; // 对剩余任务发起取消请求 for (auto& fut : remaining_futs) { fut.cancel(); } } // 可选:处理剩余任务的取消结果 for (auto& fut : remaining_futs) { try { fut.get(); } catch (const hpx::task_canceled& e) { std::cout << "Task canceled: " << e.what() << "\n"; } } hpx::finalize(); return 0; }
关键注意事项
- 如果任务未添加取消检查点,
cancel()仅会标记future为取消状态,调用get()会抛出异常,但任务本身会继续执行至结束。 - 若无需确保任务终止,可跳过后续的
get()调用,但可能导致资源无法及时释放,建议根据场景选择。
内容的提问来源于stack exchange,提问作者user26521955
相关产品推荐
相关产品推荐

