• std::future, std::async, std::promise


    这是 C++ 的新特性;

    直接示例说明;

    #include
    #include
    #include
     

    int testThread_2()

    {  

    std::cout <<"start start start start start start start start start start start start " << std::endl;  

      std::this_thread::sleep_for(std::chrono::milliseconds(1000));

    std::cout << "stop stop stop stop stop stop stop stop stop stop stop stop " << std::endl;

     return 12345;

    }

    int main()

    {

        std::future<int> ret = std::async(testThread_2);  

    std::cout << ret.get() << std::endl;

    }

    1:

    std::async:启动一个线程,不可以用 for 循环启动多个线程,这样会一个线程执行完成,在执行下一个线程;  

                        单挑语句执行,多线程效果;

    std::future:获取线程返回结果;

    ret.get() :这个函数会阻塞当前线程,直到 ret 有值;

                       ret 的值,get()一次后,无效了;

    2:

    ret.wait_for(std::chrono::milliseconds(500));

    启动线程后,执行这条语句,会让线程先执行 500 毫秒后,在向后执行;

    3:

    如果觉得 get()函数可能会长期阻塞函数,可以添加等待超时,非常好用;
     

        std::future<int> ret = std::async(testThread_2);   //启动线程;

    std::chrono::system_clock::time_point two_seconds_passed = std::chrono::system_clock::now() + std::chrono::seconds(10);

        std::future_status ret_fstatus = ret.wait_until(two_seconds_passed); //超时等待;

        if (ret_fstatus == std::future_status::ready) //判断超时原因;

        {

           std::cout << ret.get() << std::endl;

        }

        else

        {

            std::cout << "time out,还没有获取结果;" << std::endl;

        }

        std::cout << "===================================================" << std::endl;

    4:

    std::promise

    这个可以在获取到 数值 前,阻塞当前线程,直到有值;

    std::promise 的价值非常好,以前的 C++ 获取网络消息,需要异步线程获取,然后再通知处理;

    现在就可以最简洁高效的写代码;

    std::promise<int> g_ret;

    void testThread_3()

    {

        std::cout << "testThread_3 in" << std::endl;

        std::this_thread::sleep_for(std::chrono::milliseconds(1000 * 5));

        g_ret.set_value(12321);

    std::cout << "testThread_3 out" << std::endl;

    }

    int main()

    {

        {

    std::future<void> ret = std::async(testThread_3); //启动线程,赋值 g_ret;

            std::cout << "g_ret.get_future().get();" << std::endl; //这句会被执行,因为上面只是启动线程;

            int n = g_ret.get_future().get(); //这里会阻塞当前线程,直到 g_ret 有值;

                                                可以看出,std::promise 获取 std::future

            std::cout << n << std::endl;

        }

    return 0;

    }

  • 相关阅读:
    Cloudreve搭建云盘系统,并实现随时访问
    【数据结构与算法】第十五篇:快速,希尔排序
    文心一言 VS 讯飞星火 VS chatgpt (232)-- 算法导论17.1 3题
    【kafka】九、kafka消费者分区分配策略
    M1Mac开启x86_64命令行archlinux虚拟机的最佳实践(qemu)
    《羊了个羊》谁还在玩我笑他两年半
    JVM(十五)—— 垃圾回收(一)
    基于CNN实现谣言检测 - python 深度学习 机器学习 计算机竞赛
    【Java基础系列】第14章 Java图形编程
    自注意力机制(Self-attention)【第四章】
  • 原文地址:https://blog.csdn.net/chinabinlang/article/details/126248069