首页 > 系统相关 >C++ Windows版本线程池

C++ Windows版本线程池

时间:2023-11-27 15:13:42浏览次数:25  
标签:std tasks Windows lock stop C++ task 线程 include

使用:

ThreadPool threadPool(12); //设定数量
threadPool.queue(myFunction,args1,args2,...); //创建任务

实现:

#include <windows.h>
#include <iostream>
#include <functional>
#include <vector>
#include <queue>
#include <mutex>
#include <condition_variable>

class ThreadPool {
public:
    ThreadPool(size_t numThreads) : stop(false) {
        for (size_t i = 0; i < numThreads; ++i) {
            workers.emplace_back([this] {
                while (true) {
                    std::function<void()> task;

                    {
                        std::unique_lock<std::mutex> lock(queueMutex);
                        condition.wait(lock, [this] { return stop || !tasks.empty(); });

                        if (stop && tasks.empty()) {
                            return;
                        }

                        task = std::move(tasks.front());
                        tasks.pop();
                    }

                    task();
                }
                });
        }
    }

    template<typename Function, typename... Args>
    void queue(Function&& f, Args&&... args) {
        auto task = [f, args...]{ f(args...); };

        {
            std::unique_lock<std::mutex> lock(queueMutex);
            tasks.emplace(std::move(task));
        }

        condition.notify_one();
    }

    ~ThreadPool() {
        {
            std::unique_lock<std::mutex> lock(queueMutex);
            stop = true;
        }

        condition.notify_all();

        for (std::thread& worker : workers) {
            worker.join();
        }
    }

private:
    std::vector<std::thread> workers;
    std::queue<std::function<void()>> tasks;

    std::mutex queueMutex;
    std::condition_variable condition;
    bool stop;
};

标签:std,tasks,Windows,lock,stop,C++,task,线程,include
From: https://www.cnblogs.com/tutuleilife/p/17859392.html

相关文章

  • C++标准库函数std::async
    1、std::asyncstd::async是C++11的标准库函数,用于创建执行异步任务并返回std::future对象来获取异步执行的结果状态。该函数最简单的用法如下所示:#include<iostream>#include<thread>#include<future>std::stringpromise_string(){for(inti=0;i<200;......
  • 多线程复制文件夹
    pThread复制文件夹C++通过pthread复制文件夹。主要处理普通文件和链接文件。事实上只要处理好链接文件即可。我们可以通过判断链接的文件是文件夹还是文件即可判断对当前文件是通过文件直接复制还是通过文件夹递归复制。#include<iostream>#include<dirent.h>#include<stri......
  • C++ Socket网络编程(TCP)
    基于Windows平台的Socket网络编程,用的QT,这个例子里一个服务端和一个客户端,两个应用程序之间进行通信,所以创建两个项目,目录结构如下:直接贴代码:服务端:1//main.cpp2#include<QCoreApplication>3#include<iostream>4#include<QDebug>5#include<cstring>6#i......
  • Windows 11 中的蓝牙版本和配置文件支持
    Windows11支持哪些蓝牙版本?Windows11版本22H2,所有版本都支持蓝牙核心规范版本5.3。WindowsServer 没有 内置蓝牙无线技术支持。独立硬件供应商可能(IHV)提供第三方蓝牙驱动程序。哪些蓝牙配置文件在Windows11中具有内置支持?核心规范Windows11支持蓝牙核心规......
  • std::future与std::promise在C++多线程同步与数据共享中的应用
    1、std::promise与std::futurestd::promise与std::future通过配合使用完成数据的同步与共享,两者均是模板类;std::promise存储异步执行的值或异常;std::future提供可供访问的异步执行结果。二者配合使用伪码如下:std::promise<Type>pr;std::future<Type>fu(pr.get_fu......
  • Windows10 下 CUDA 新旧多版本共存
    前言    为了运行一个Tensorflow1.6.0的项目,CPU跑了三个多小时才完成一个epoch,还得用GPU。但这个版本的TF只能在10以下的CUDA平台,但是以前的Pytorch也要继续啊。所以需要在本地Windows下安装多个版本CUDA,其实有两种方式让CUDA共存。一种是英伟达的工具......
  • C++聊天集群服务器2
    ​ 总体项目结构如下:一、数据库的封装​ db.h如图代码量不多​ db.cpp:#include"db.h"#include<muduo/base/Logging.h>//数据库配置信息staticstringserver="127.0.0.1";staticstringuser="root";staticstringpassword="123456";st......
  • 关闭 Windows 自动更新
    前言windows系统自动更新很烦人,推迟更新只能推迟一段时间,特别是睡眠状态下也会自动更新。采取下面这个办法可以彻底关闭自动更新。最终页面显示:参考链接五大方法永久彻底关闭WIN10系统自动更新【已验证有效】......
  • C++11 后的单例写法
    template<typenameT>classSingleton{public:staticT&getInstance(){staticTt;returnt;}Singleton(constSingleton&)=delete;Singleton&operator=(constSingleton&)=delete;protected:......
  • 如何使用Windows电脑上的多开器同时抓取多个网络数据
    当你需要同时抓取多个网络数据时,使用Windows电脑上的多开器是一个非常有效的方法。通过这种方法,你可以在同一台电脑上同时打开多个相同的应用程序,并且每个应用程序都可以运行独立的任务。下面是一个关于如何使用Windows电脑上的多开器同时抓取多个网络数据的简要指南:步骤1:选择合适......