C++11中的线程池?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (160)

代码:

namespace {
  std::vector<std::thread> workers;

  int total = 4;
  int arr[4] = {0};

  void each_thread_does(int i) {
    arr[i] += 2;
  }
}

int main(int argc, char *argv[]) {
  for (int i = 0; i < 8; ++i) { // for 8 iterations,
    for (int j = 0; j < 4; ++j) {
      workers.push_back(std::thread(each_thread_does, j));
    }
    for (std::thread &t: workers) {
      if (t.joinable()) {
        t.join();
      }
    }
    arr[4] = std::min_element(arr, arr+4);
  }
  return 0;
}

与每次迭代时创建和连接线程不同,我更希望每个迭代都将任务发送给我的工作线程,并且只创建它们一次。

提问于
用户回答回答于

你可以使用C++线程库,https://github.com/vit-vit/ctpl...

然后,编写的代码可以替换为以下代码

#include <ctpl.h>  // or <ctpl_stl.h> if ou do not have Boost library

int main (int argc, char *argv[]) {
    ctpl::thread_pool p(2 /* two threads in the pool */);
    int arr[4] = {0};
    std::vector<std::future<void>> results(4);
    for (int i = 0; i < 8; ++i) { // for 8 iterations,
        for (int j = 0; j < 4; ++j) {
            results[j] = p.push([&arr, j](int){ arr[j] +=2; });
        }
        for (int j = 0; j < 4; ++j) {
            results[j].get();
        }
        arr[4] = std::min_element(arr, arr + 4);
    }
}
用户回答回答于

线程池意味着所有线程都在运行-换句话说,线程函数永远不会返回。为了给线程一些有意义的工作,必须设计一个线程间通信的系统,既为了告诉线程有一些事情要做,也为了通信实际的工作数据。

通常情况下,这将涉及某种并发数据结构,每个线程可能会在某种条件变量上休眠,在有工作要做时会通知这些变量。收到通知后,一个或多个线程唤醒,从并发数据结构中恢复任务,处理它,并以类似的方式存储结果。

然后线程将继续检查是否还有更多的工作要做,如果没有,则继续检查是否还有更多的工作要做。

扫码关注云+社区

领取腾讯云代金券