跳至主要內容

57.C++多线程_异步

约 450 字大约 2 分钟

std::async、 std::future、 std::promise

特性      	std::async	                std::promise	        std::packaged_task
适用场景	    后台执行任务	                    手动传递结果	            封装任务对象
自动启动	    ✅ 是	                    ❌ 否(需手动管理线程)	    ❌ 否(需手动启动)
是否阻塞	    ❌ 否(除非 get() 被调用)	    ❌ 否(异步传递结果)	    ❌ 否(任务对象可延迟执行)
适用于	    简单异步计算	                手动管理线程通信	        任务队列、线程池

std::async 异步任务

#include <iostream>
#include <future>
#include <chrono>

int compute() {
    std::this_thread::sleep_for(std::chrono::seconds(2));  // 模拟耗时任务
    return 42;
}

int main() {
    std::future<int> result = std::async(std::launch::async, compute);

    std::cout << "主线程继续执行...\n";

    int value = result.get();  // 获取结果(阻塞等待)
    std::cout << "异步任务结果:" << value << std::endl;

    return 0;
}

std::future + std::promise(手动控制异步)

#include <iostream>
#include <thread>
#include <future>

void compute(std::promise<int> p) {
    std::this_thread::sleep_for(std::chrono::seconds(2)); 
    p.set_value(100);  // 计算完成,返回结果
}

int main() {
    std::promise<int> p;
    std::future<int> f = p.get_future();

    std::thread t(compute, std::move(p));

    std::cout << "主线程继续执行...\n";

    int value = f.get();  // 等待并获取结果
    std::cout << "异步任务结果:" << value << std::endl;

    t.join();
    return 0;
}


std::packaged_task(将函数封装成异步任务)

#include <iostream>
#include <future>
#include <thread>

int compute(int x) {
    std::this_thread::sleep_for(std::chrono::seconds(2));
    return x * 2;
}

int main() {
    std::packaged_task<int(int)> task(compute);
    std::future<int> result = task.get_future();

    std::thread t(std::move(task), 10);

    std::cout << "主线程继续执行...\n";

    int value = result.get();
    std::cout << "计算结果:" << value << std::endl;

    t.join();
    return 0;
}

std::future::wait_for()(超时等待)

#include <iostream>
#include <future>
#include <chrono>

int compute() {
    std::this_thread::sleep_for(std::chrono::seconds(5));
    return 42;
}

int main() {
    std::future<int> result = std::async(std::launch::async, compute);

    std::cout << "等待任务完成(最多 3 秒)...\n";
    if (result.wait_for(std::chrono::seconds(3)) == std::future_status::ready) {
        std::cout << "计算结果:" << result.get() << std::endl;
    } else {
        std::cout << "任务超时!\n";
    }

    return 0;
}