c++ async future get

Posted Fred1987

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ async future get相关的知识,希望对你有一定的参考价值。

#include <chrono>
#include <ctime>
#include <future>
#include <iomanip>
#include <iostream>
#include <sstream>
#include <string>
#include <unistd.h>
#include <uuid/uuid.h>

std::string get_time_now()

    std::chrono::time_point<std::chrono::high_resolution_clock> now = std::chrono::high_resolution_clock::now();
    time_t raw_time = std::chrono::high_resolution_clock::to_time_t(now);
    struct tm tm_info = *localtime(&raw_time);
    std::stringstream ss;
    std::chrono::seconds seconds = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch());
    std::chrono::milliseconds mills = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch());
    std::chrono::microseconds micros = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch());
    std::chrono::nanoseconds nanos = std::chrono::duration_cast<std::chrono::nanoseconds>(now.time_since_epoch());
    ss<<std::put_time(&tm_info,"%Y%m%d%H%M%S")
    <<std::setw(3)<<std::setfill(\'0\')<<std::to_string(mills.count()-seconds.count()*1000)
    <<std::setw(3)<<std::setfill(\'0\')<<std::to_string(micros.count()-mills.count()*1000)
    <<std::setw(3)<<std::setfill(\'0\')<<std::to_string(nanos.count()-micros.count()*1000);
    return ss.str();


char* uuid_value=(char*)malloc(40);
char* get_uuid()

    uuid_t new_uuid;
    uuid_generate(new_uuid);
    uuid_unparse(new_uuid,uuid_value);
    return uuid_value;


std::string get_num_and_uuid(const int&len)

    std::stringstream ss;
    for(int i=0;i<len;i++)
    
        ss<<i+1<<","<<get_uuid()<<std::endl;
        sleep(1);
    
    return ss.str();


void async_future_demo(const int &len)

    std::cout<<get_time_now()<<",start in "<<__FUNCTION__<<std::endl;
    std::future<std::string> fut=std::async(get_num_and_uuid,std::cref(len));
    std::cout<<get_time_now()<<" wait for the result!"<<std::endl;
    std::cout<<get_time_now()<<",the result is "<<fut.get()<<std::endl;
    std::cout<<get_time_now()<<",end in "<<__FUNCTION__<<std::endl;


int main(int args,char **argv)

    async_future_demo(atoi(argv[1]));

Compile

g++ -g -std=c++2a -I. *.cpp -o h1 -luuid

 

 

 

使用 c++ async 进行并行编程

【中文标题】使用 c++ async 进行并行编程【英文标题】:Parallel programming with c++ async 【发布时间】:2016-12-30 15:54:39 【问题描述】:

有没有办法设置使用异步函数(从未来)可以创建的最大线程数? 我更喜欢使用 async/future.get 因为它可以转换为同步/生成多任务模型,这很常见 在有关算法的教科书中(即 Cormen)。我希望能够获得 T[p](使用 p 个处理器/线程完成程序的时间)。

【问题讨论】:

您可以将所有对 async 的调用放在一个类的方法中,如果对成员函数的调用次数高于您在构造实例时可以指定的某个限制,该方法将拒绝执行任何操作类的。如果您的程序达到或超过限制,您希望您的程序做什么? 快速而肮脏的解决方案:将信号量初始化为您希望能够同时进行的线程数。让您的线程程序等待该信号量。这并不能将您从创建线程的开销中解放出来,但至少任何额外的线程都会安静地旋转。 或者:有一个原子(优先级)队列,让池中的工作线程从队列中获取下一个任务,但您已经说过您宁愿进行同步/生成。 【参考方案1】:

很遗憾,没有。众所周知,std::async 对线程创建方式的控制非常有限。

您可以考虑改用 boost 线程池。这是boost asio 的一部分(有点反直觉),并使用io_service 对象,即使/如果您实际上并未将其用于 I/O。

这样可以很容易地控制使用的线程数,包括只使用一个。

当然,您可以从标准组件构建自己的线程池类。当然可能,但并非完全是微不足道的任务。

【讨论】:

以上是关于c++ async future get的主要内容,如果未能解决你的问题,请参考以下文章

有条件的 std::future 和 std::async

c++中的异步编程——future,promise

记录一个std::future和std::async的demo

Dart 中断Future

std::future<>::get 清空结果

使用 std::async 时 C++“无法推断模板参数”