zoukankan      html  css  js  c++  java
  • c++11の异步方法 及线程间通信

    1. std::promise 可以用来在线程间提供数据传递。

    std::future = std::promise.get_future()。

    线程中可以对promise赋值std::promise.set_value。

    赋值之后std::future.get()就会返回其他线程中设置的值。

     
    #include <iostream>
    #include <future>
    #include <chrono>
    
    std::promise<int> promis;
    int main(int argc, const char * argv[]) {
        std::future<int> fuResult = promis.get_future();
        std::thread t([](){
            std::this_thread::sleep_for(std::chrono::seconds(10));
            promis.set_value(123);
        });
        t.detach();
        std::cout<<"detach..."<<std::endl;
        std::cout<<fuResult.get()<<std::endl;
        return 0;
    }
    #include "stdafx.h"
    #include <iostream>
    #include <future>
    #include <chrono>
    #include <string>
    
    std::promise<std::string> promis;
    int main()
    {
        std::future<std::string> fuResult = promis.get_future();
    
        auto t_cb=[]() 
        {
            std::cout << "subThread start!"<<std::endl;
            std::chrono::milliseconds dur(10000);
            std::this_thread::sleep_for(dur);
            promis.set_value("value from subThread");
        };
    
        std::thread t(t_cb);
        t.detach();
        std::cout << "detach..." << std::endl;
        std::cout << fuResult.get() << std::endl;
    
        getchar();
        return 0;
    }

     

    2. std::packaged_task  可以包裹一个函数, 有点类似std::function,不同之处在于这个可以通过get_future返回std::future对象来获取异步执行的函数结果。

    #include "stdafx.h"
    #include <iostream>
    #include <future>
    #include <chrono>
    #include <string>
    
    int main()
    {
        std::packaged_task<int()> task([]() 
        {
            std::cout << "packaged_task start!"<<std::endl;
            std::chrono::milliseconds dur(10000);
            std::this_thread::sleep_for(dur);
            return 10000;
        });
        std::future<int> fuResult = task.get_future();
        std::thread t_task(std::move(task));
        t_task.detach();
        std::cout << "detach..." << std::endl;
        std::cout << fuResult.get() << std::endl;
        getchar();
        return 0;
    }

    3. std::async提供异步执行的方法,std::future = std::async(...), 函数执行完成后可以通过std::future.get()获取到执行函数的返回值。

    #include <iostream>
    #include <future>
    #include <chrono>
    
    int main(int argc, const char * argv[]) 
    { std::future
    <int> fuResult = std::async([]()
    { std::this_thread::sleep_for(std::chrono::seconds(
    10)); return 1; }); std::cout<<"detach..."<<std::endl; std::cout<<fuResult.get()<<std::endl; return 0; }

    多线程一----多线程的应用

    多线程二----简单线程管理

    多线程三----数据竞争和互斥对象

    多线程四----死锁和防止死锁

    多线程五----unick_lock和once_flag

    多线程六----条件变量

    多线程七----线程间通信

  • 相关阅读:
    HDU 1333 基础数论 暴力
    HDU 1299 基础数论 分解
    HDU 1211 EXGCD
    HDU 3507 单调队列 斜率优化
    博弈
    std:ios::sync_with_stdio(false);
    NBUT[1220] SPY
    nbut1217 Dinner
    poj2236Wireless Network
    ZOJ Problem Set
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/6598931.html
Copyright © 2011-2022 走看看