c++ - 构造多个线程以获得最佳性能的正确方法是什么?

标签 c++ multithreading performance c++11

我想知道何时使用lambda表达式定义线程,这将有助于提高一些性能。就我而言,我必须运行多个线程。这是基于实时的应用程序。因此,如果有人向我建议创建多个线程的最佳方法是什么。创建线程发生在实际代码库的每次迭代中。这是高级迭代中正在发生的事情的一个示例。因此,这是将要优化的一种昂贵的操作。

  #include <iostream>
  #include <thread>
  #include <vector>
  #include <algorithm>

  class Task
  {
    public:
    void execute(std::string command)
    {
      //TODO actual logic
      for(int i = 0; i < 5; i++)
      {
        std::cout<<command<<std::endl;
      }
    }
  };

  int main()
  {          
      Task* taskPtr = new Task();
      std::vector<std::thread> workers_older;
      for (int i = 0; i < 2; i++) {
          workers_older.push_back(std::thread(&Task::execute, taskPtr, "Task: without lambda expression"+ std::to_string(i)));
      }
      std::for_each(workers_older.begin(), workers_older.end(), [](std::thread &t) 
      {
          t.join();
      });

      std::vector<std::thread> workers;
      for (int i = 0; i < 2; i++) {
          workers.push_back(std::thread([&]() 
          {
              taskPtr->execute("Task: "+ std::to_string(i));
          }));
      }
      std::for_each(workers.begin(), workers.end(), [](std::thread &t) 
      {
          t.join();
      });
      return 0;
  }

编辑:
在对要执行的操作提出宝贵意见之后,我按照他们的建议提供了答案。

最佳答案

将成员函数的地址和一组参数传递给std::thread构造函数与传递具有适当捕获的lambda函数之间的开销几乎没有差别。
std::thread构造函数中的大开销实际上是在启动线程本身。

如果您知道要在程序的多个位置使用相同数量的工作线程,则可能值得将它们作为长时间运行的线程并排成一排的任务。

关于c++ - 构造多个线程以获得最佳性能的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59282836/

相关文章:

c++ - 在 C++ 的元编程中保护从非 const-volatile 类型到 const-volatile 的赋值的正确方法是什么?

java - 在并发环境中创建单例的最佳实践?

c++ - 何时使用 C++11 mutex、lock、unique_lock、shared_lock 等

java - Swing 大文件性能

c++ - 在构造具有 const 成员的对象时调用另一个构造函数

c++ - 快速 C/C++/MATLAB SURF 特征库

c++ - c++自制列表

java - 线程池工作线程被 Runnables 淹没导致 JVM 崩溃

c# - 内存缓存 .Net 4.0 性能测试 : astonishing result

c# - 优化 Entity Framework 查询