028-86922220

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

【并发编程十一】c++线程同步——future-创新互联

【并发编程十一】c++线程同步——future

简介:
本篇文章,我们详细的介绍下c++标准库提供的线程同步方法中的第3个——future。

为青羊等地区用户提供了全套网页设计制作服务,及青羊网站建设行业解决方案。主营业务为网站设计、做网站、青羊网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!一、互斥

参见【并发编程九】c++线程同步——互斥(mutex)

二、条件变量

参见【并发编程十】c++线程同步——条件变量(condition_variable)

三、future

类模板 std::future 提供访问异步操作结果的机制:

注意, std::future 所引用的共享状态不与另一异步返回对象共享(与 std::shared_future 相反)。

在这里插入图片描述

1、promise

备注:简单来说,就是以下过程

1.1、子线程设值,主线程获取
#include#include#includeusing namespace std;

void task(int a, int b, promise& p)
{p.set_value(a + b);
}
int main()
{// 把promise和future做关联
    promisep;
    futuref=p.get_future();

    thread task1(task,1,2,ref(p));

    //do somesthing

    //get promise value
    f.wait();
    cout<< "return value is "<< f.get()<< '\n';//只能get一次。

    task1.join();
}

在这里插入图片描述

1.2、主线程设置值,子线程获取
#include#include#includeusing namespace std;

void task(int a, future& b, promise& p)
{p.set_value(a + b.get());
}
int main()
{// 把promise和future做关联
    promisep_ret;
    futuref_ret=p_ret.get_future();

    promisep_in;
    futuref_in = p_in.get_future();

    thread task1(task,1,ref(f_in),ref(p_ret));

    //do somesthing
    //...
    p_in.set_value(3);

    //get promise value
    f_ret.wait();
    cout<< "return value is "<< f_ret.get()<< '\n';//只能get一次。

    task1.join();
}

在这里插入图片描述

2、async

异步运行一个函数(有可能在新线程中执行),并返回保有其结果的 std::future.

2.1、不开新线程的async
#include#include#includeusing namespace std;

int task(int a, int b)
{return a + b;
}


int main()
{// 把async和future做关联
    futuref = async(task, 1, 5);

    //get future value
    f.wait();
    cout<< "return value is "<< f.get()<< '\n';
}

在这里插入图片描述

2.2、开新线程的async
#include#include#includeusing namespace std;

int task(int a, int b)
{return a + b;
}


int main()
{// 把async和future做关联
    futuref = async(launch::async,task, 1, 5);

    //get future value
    f.wait();
    cout<< "return value is "<< f.get()<< '\n';
}

输出结果和不开线程一样的

3、packaged_task3.1、不使用bind
#include#include#includeusing namespace std;

int task(int a, int b)
{return a + b;
}

int main()
{// 调用packaged_task的构造函数,返回值和两个参数都是int类型,
    packaged_taskt(task);
    //执行
    t(5,5);

    // 把packaged_task和future做关联
    futuref = t.get_future();

    //获取返回值的结果
    f.wait();
    cout<< "return value is "<< f.get()<< '\n';
}

输出

在这里插入图片描述

3.2、提前指定参数
#include#include#includeusing namespace std;

int task(int a, int b)
{return a + b;
}

int main()
{// 调用packaged_task的构造函数,返回值和两个参数都是int类型,
    packaged_taskt(std::bind(task,11,12));
    //执行
    t();

    // 把packaged_task和future做关联
    futureresult = t.get_future();

    //获取返回值的结果
    result.wait();
    cout<< "return value is "<< result.get()<< '\n';
}

在这里插入图片描述

3.3、bind

bind返回参数为std::function

#include#include#includeusing namespace std;

int task(int a, int b)
{return a + b;
}

int main()
{// bind返回值为std::function,
    auto a = bind(task, 11, 14);
    //执行
    int result = a();

    cout<< "return value is "<< result<< '\n';
}

在这里插入图片描述

备注:既然bind就可以获取结果,为何还要用packaged_task,当然是因为future啊。

4、shared_future
#include#include#includeusing namespace std;

mutex mtx;

void task(int a, shared_future& b, promise& p)
{p.set_value(2);
    b.wait();
    int bb = b.get();
    lock_guardguard(mtx);
    cout<< "task b ="<< b.get()<// 把promise和future做关联
    promisep_ret_1,p_ret_2;

    futuref1 = p_ret_1.get_future();
    futuref2 = p_ret_2.get_future();

    promisep_in;
    shared_futures_f = p_in.get_future();

    thread task1(task, 1, ref(s_f), ref(p_ret_1));
    thread task2(task, 2, ref(s_f), ref(p_ret_2));

    //do somesthing
    f1.wait();
    f2.wait();
    //...
    p_in.set_value(3);

    //get promise value
    {lock_guardguard(mtx);
        cout<< "main() return value is "<< f1.get()<< '\n';//只能get一次。
        cout<< "main() return value is "<< f2.get()<< '\n';//只能get一次。
    }

    task1.join();
    task2.join();
}

在这里插入图片描述

参考:
1、https://www.apiref.com/cpp-zh/cpp/thread.html
2、https://en.cppreference.com/w/cpp/thread
3、书籍《c++服务器开发精髓》——张远龙

四、信号量

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前名称:【并发编程十一】c++线程同步——future-创新互联
网页地址:http://www.tsicrk.com/article/cogdjg.html

其他资讯

让你的专属顾问为你服务

1.5138s