C++11 异步操作实现线程池

std::future

介绍

std::future 是 C++11 标准库中的一个模板类,它表示一个异步操作的结果。当我们在多线程编程中使用异步任务时,std::future 可以帮助我们在需要的时候获取任务的执行结果。std::future 的一个重要特性是能够阻塞当前线程,直到异步操作完成,从而确保我们在获取结果时不会遇到未完成的操作。

应用场景

• 异步任务: 当我们需要在后台执行一些耗时操作时,如网络请求或计算密集型任务等,std::future 可以用来表示这些异步任务的结果。通过将任务与主线程分离,我们可以实现任务的并行处理,从而提高程序的执行效率

• 并发控制: 在多线程编程中,我们可能需要等待某些任务完成后才能继续执行其他操作。通过使用 std::future,我们可以实现线程之间的同步,确保任务完成后再获取结果并继续执行后续操作

• 结果获取:std::future 提供了一种安全的方式来获取异步任务的结果。我们可以使用 std::future::get()函数来获取任务的结果,此函数会阻塞当前线程,直到异步操作完成。这样,在调用 get()函数时,我们可以确保已经获取到了所需的结果

用法示例

• 使用 std::async 关联异步任务std::async 是一种将任务与 std::future 关联的简单方法。它创建并运行一个异步任务,

并返回一个与该任务结果关联的 std::future 对象。默认情况下,std::async 是否启动一个新线程,或者在等待 future 时,任务是否同步运行都取决于你给的 参数。这个参数为 std::launch 类型:

○ std::launch::deferred 表明该函数会被延迟调用,直到在 future 上调用 get()或者 wait()才会开始执行任务

○ std::launch::async 表明函数会在自己创建的线程上运行

○ std::launch::deferred | std::launch::async 内部通过系统等条件自动选择策略

代码如下:

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

int Add(int num1,int num2)
{
    std::cout<<"加法1111\n";
    std::this_thread::sleep_for(std::chrono::seconds(5));
    std::cout<<"加法2222\n";
    return num1+num2;
}
int main()
{
    std::cout<<"-------1--------\n";
    std::future<int> result=std::async(std::launch::deferred,Add,11,22);
    std::cout<<"-------2--------\n";
    std::this_thread::sleep_for(std::chrono::seconds(1));
    int sum=result.get();
    std::cout<<"-------3--------\n";
    std::cout<<sum<<std::endl;
    return 0;
}
#include <iostream>
#include <thread>
#include <future>

void Add(int num1,int num2,std::promise<int> &prom)
{
    std::this_thread::sleep_for(std::chrono::seconds(3));
    prom.set_value(num1+num2);
    return ;
}
int main()
{
    std::promise<int> prom;
    std::future<int> fu=prom.get_future();
    std::thread thr(Add,11,22,std::ref(prom));
    int res=fu.get();
    std::cout<<"sum: "<<res<<std::endl;
    thr.join();
    return 0;
}
promise:promise.cc
	g++ -std=c++11 $^ -o $@ -lpthread
async:async.cc
	g++ -std=c++11 $^ -o $@ -lpthread

运行结果:

root@VM-4-5-ubuntu:~# cd demo/
root@VM-4-5-ubuntu:~/demo# cd future/
root@VM-4-5-ubuntu:~/demo/future# make
g++ -std=c++11 promise.cc -o promise -lpthread
root@VM-4-5-ubuntu:~/demo/future# ./promise
sum: 33
root@VM-4-5-ubuntu:~/demo/future# make
g++ -std=c++11 promise.cc -o promise -lpthread
root@VM-4-5-ubuntu:~/demo/future# ./promise
sum: 33

更多推荐