C++;-cURL-将多个easy_init与std::async一起使用与使用单个多_init之间的区别 在我的C++程序中,我正在从Web下载数据。我可以在concurent中下载多达100次,但它们通常不会立即启动,而且通常只有4次等

C++;-cURL-将多个easy_init与std::async一起使用与使用单个多_init之间的区别 在我的C++程序中,我正在从Web下载数据。我可以在concurent中下载多达100次,但它们通常不会立即启动,而且通常只有4次等,c++,curl,C++,Curl,目前,我正在使用curl\u easy\u init和std::async在后台运行下载。 我读过有关curl\u multi\u init的文章。据我所知,它只是一个由cURL开发人员制作的异步包装器。我是对的,还是有任何其他原因,为什么我应该使用它来代替easy_init的多个异步作业?子系统是完全异步的,它有许多优点,例如: 它不会消耗任意数量的线程。每次调用std::async都将创建一个线程。如果此线程创建是无限制的,那么您的程序可能会意外地耗尽资源 传输可以在您的控制下中断或取消 由

目前,我正在使用
curl\u easy\u init
std::async
在后台运行下载。
我读过有关curl\u multi\u init的文章。据我所知,它只是一个由cURL开发人员制作的异步包装器。我是对的,还是有任何其他原因,为什么我应该使用它来代替easy_init的多个异步作业?

子系统是完全异步的,它有许多优点,例如:

  • 它不会消耗任意数量的线程。每次调用
    std::async
    都将创建一个线程。如果此线程创建是无限制的,那么您的程序可能会意外地耗尽资源

  • 传输可以在您的控制下中断或取消

  • 由于所有传输共享相同的IO循环,因此它将更加高效。唯一的争用点是
    select()
    调用(或
    select\u multi\u socket
    的等效调用)


  • curl\u multi\u
    子系统是完全异步的,具有许多优点,例如:

  • 它不会消耗任意数量的线程。每次调用
    std::async
    都将创建一个线程。如果此线程创建是无限制的,那么您的程序可能会意外地耗尽资源

  • 传输可以在您的控制下中断或取消

  • 由于所有传输共享相同的IO循环,因此它将更加高效。唯一的争用点是
    select()
    调用(或
    select\u multi\u socket
    的等效调用)


  • 使用多接口的另一个额外好处是,默认情况下连接缓存是共享的,而不是每个线程中都有一个单独的连接缓存。尽管libcurl也提供了一个API来共享它,只需多做一点工作…@hanshenrik,但我假设了launch::async的情况。当然,标准上说“就像一条新的线”。但是,创建无限线程的问题仍然存在。标准中没有任何内容阻止它,因此我们必须假设它可能会发生(就像在gcc和clang上一样)。使用多接口的另一个额外好处是,默认情况下连接缓存是共享的,而不是每个线程中都有一个单独的连接缓存。尽管libcurl也提供了一个API来共享它,只需多做一点工作…@hanshenrik,但我假设了launch::async的情况。当然,标准上说“就像一条新的线”。但是,创建无限线程的问题仍然存在。标准中没有任何内容阻止它,因此我们必须假设它可能发生(正如它在gcc和clang上所做的那样)