无忧资源站

 找回密码
 加入我们
查看: 761|回复: 0

[C/C++] c++实现跨平台的线程池

[复制链接]

18

主题

22

帖子

174

积分

学徒

Rank: 2

积分
174

最佳新人

发表于 2023-10-28 05:12:34 | 显示全部楼层 |阅读模式
  1. #include <iostream>
  2. #include <queue>
  3. #include <thread>
  4. #include <mutex>
  5. #include <condition_variable>

  6. class ThreadPool {
  7. public:
  8.     ThreadPool(size_t numThreads) : stop(false) {
  9.         for (size_t i = 0; i < numThreads; ++i) {
  10.             workers.emplace_back([this] {
  11.                 while (true) {
  12.                     std::function<void()> task;
  13.                     {
  14.                         std::unique_lock<std::mutex> lock(queueMutex);
  15.                         condition.wait(lock, [this] { return stop || !tasks.empty(); });
  16.                         if (stop && tasks.empty()) {
  17.                             return;
  18.                         }
  19.                         task = std::move(tasks.front());
  20.                         tasks.pop();
  21.                     }
  22.                     task();
  23.                 }
  24.             });
  25.         }
  26.     }

  27.     template <class F, class... Args>
  28.     void enqueue(F&& f, Args&&... args) {
  29.         {
  30.             std::unique_lock<std::mutex> lock(queueMutex);
  31.             tasks.emplace([=] { std::forward<F>(f)(std::forward<Args>(args)...); });
  32.         }
  33.         condition.notify_one();
  34.     }

  35.     ~ThreadPool() {
  36.         {
  37.             std::unique_lock<std::mutex> lock(queueMutex);
  38.             stop = true;
  39.         }
  40.         condition.notify_all();
  41.         for (std::thread& worker : workers) {
  42.             worker.join();
  43.         }
  44.     }

  45. private:
  46.     std::vector<std::thread> workers;
  47.     std::queue<std::function<void()>> tasks;
  48.     std::mutex queueMutex;
  49.     std::condition_variable condition;
  50.     bool stop;
  51. };

  52. void printNumber(int number) {
  53.     std::cout << "Number: " << number << std::endl;
  54. }

  55. int main() {
  56.     ThreadPool pool(4);

  57.     for (int i = 0; i < 10; ++i) {
  58.         pool.enqueue(printNumber, i);
  59.     }

  60.     return 0;
  61. }
复制代码


QQ|SiteMap|Map|小黑屋|无忧资源站

GMT+8, 2024-5-19 17:12 , Processed in 0.078379 second(s), 20 queries .

无忧资源站

Copyright © 2022-2032 www.wyzyz.net

快速回复 返回顶部 返回列表