c++ - 处理多个std::async调用

原文 标签 c++ multithreading c++11 asynchronous c++14

我有一个要求,我需要有效地删除数千个文件。目前,文件是按顺序删除的。

我想通过使用std::async()以异步方式调用delete来加快删除速度。

电流:

  • 获取文件列表
  • 对于每个文件调用delete()

  • 所需流量:
  • 获取文件列表
  • 对于每个文件:
  • 使用std::async()调用AsyncDelete()
  • 将 future 对象存储在 vector

  • 等待每个删除操作完成,然后返回

  • 我将使用std::launch::async启动每个异步任务,以使其在单独的线程上运行。

    我有以下问题:
  • async()是否适合涉及多个任务的工作负载?还是将线程用于此类任务更好?我读了Scott Myer的书“Effective Modern C++”中的一章(项目35:基于任务的编程比基于线程的编程),他建议使用基于任务的编程而不是基于线程的编程。
  • 每个“async()”调用的成本是多少?它是否有任何线程创建开销之类的开销?我计划控制每个周期调用的异步任务的数量。例如如果要删除10,000个文件,则每个周期只调用100次删除,而不是一次性生成10,000个async()任务。我希望标准库实现可以有效地处理多个异步调用(例如使用线程池)。
  • 由async()返回的
  • future()对象公开了get()和wait()方法。我读到,get()内部调用wait()。在存储在 vector 中的每个 future 上调用get()是否足够?
  • 如果get()从不返回怎么办?是否建议在超时的情况下使用wait_for()?
  • 最佳答案

    您可能会发现这实际上并没有您想要的那么多。文件系统可能具有内核级别的锁定(以确保一致性),并且有许多线程被这些锁定击中,很可能会引起麻烦。

    我建议

  • 获取文件列表。
  • 将列表划分为(例如)十个相等的块(由迭代器对表示)。
  • 启动十个线程,每个线程删除其自己的列表块。
  • 等待十个线程完成。
  • 使用10的不同值进行实验。
  • 关于c++ - 处理多个std::async调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36308224/

    相关文章:

    c++ - 使用`delete`从链表中删除一个节点

    c++ - 省略 else 关键字

    c++ - 使用存储在可变参数数据结构中的字段作为方法参数

    java - java 中的 volatile 具有 long、int、boolean 和许多不同的 write 情况

    c++ - C++错误:类型 'double'和<unresolved重载函数类型'的无效操作数到二进制 'operator'

    java - ThreadLocal中的多个对象

    multithreading - 为什么基于 channel 的锁定块?

    c++ - 定时指针是否存在?

    c++ - C++ std::string到数字模板

    c++ - 不归路的意义何在?