当前位置: 首页 > news >正文

如和实现一个服务器端高并发线程池

实现一个服务器端线程池需要处理多个客户端请求,同时提高资源利用率和响应速度。

  • main函数中,创建一个线程池并提交多个任务。
  • 每个任务在不同的线程中执行,演示了线程池的并发处理能力
#include <iostream>
#include <vector>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <atomic>

// 线程池类定义
class ThreadPool {
public:
    // 构造函数,接受线程数量作为参数
    ThreadPool(size_t numThreads);
    // 析构函数
    ~ThreadPool();

    // 向任务队列中添加任务
    void enqueueTask(std::function<void()> task);

private:
    // 工作线程的集合
    std::vector<std::thread> workers;
    // 任务队列
    std::queue<std::function<void()>> tasks;

    // 互斥锁保护任务队列
    std::mutex queueMutex;
    // 条件变量用于线程同步
    std::condition_variable condition;
    // 原子布尔值,用于指示线程池是否停止
    std::atomic<bool> stop;

    // 每个线程执行的函数
    void workerThread();
};

// 线程池构造函数
ThreadPool::ThreadPool(size_t numThreads) : stop(false) {
    // 创建指定数量的线程,并将它们添加到工作线程集合中
    for (size_t i = 0; i < numThreads; ++i) {
        workers.emplace_back([this] { this->workerThread(); });
    }
}

// 线程池析构函数
ThreadPool::~ThreadPool() {
    // 设置停止标志为true
    stop = true;
    // 通知所有等待的线程
    condition.notify_all();
    // 等待所有线程完成工作
    for (std::thread &worker : workers) {
        if (worker.joinable()) {
            worker.join();
        }
    }
}

// 将任务添加到任务队列中
void ThreadPool::enqueueTask(std::function<void()> task) {
    {
        // 加锁以保护任务队列
        std::unique_lock<std::mutex> lock(queueMutex);
        // 将任务添加到队列中
        tasks.push(task);
    }
    // 通知一个等待的线程
    condition.notify_one();
}

// 每个线程执行的函数,从任务队列中提取任务并执行
void ThreadPool::workerThread() {
    while (!stop) {
        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();
    }
}

// 主函数,演示线程池的使用
int main() {
    // 创建一个线程池,包含4个线程
    ThreadPool pool(4);

    // 提交8个任务到线程池
    for (int i = 0; i < 8; ++i) {
        pool.enqueueTask([i] {
            std::cout << "Processing task " << i << " in thread " << std::this_thread::get_id() << std::endl;
        });
    }

    // 等待一段时间以确保所有任务完成
    std::this_thread::sleep_for(std::chrono::seconds(2));
    return 0;
}
  1. ThreadPool类:表示线程池,包含线程向量、任务队列、互斥锁、条件变量和停止标志。
  2. 构造函数:初始化线程池,创建指定数量的线程,并将每个线程指向workerThread函数。
  3. 析构函数:设置停止标志,通知所有线程并等待它们完成。
  4. enqueueTask方法:将任务添加到任务队列中,并通知一个等待线程。
  5. workerThread方法:线程工作函数,从任务队列中提取任务并执行。

相关文章:

  • 【C++】滑动窗口算法
  • Kubernetes服务部署 —— Kafka
  • 安卓Android与iOS设备管理对比:企业选择指南
  • SVN 拉取,文件冲突 解决办法
  • ClickHouse 数据倾斜实战:案例分析与优化技巧
  • 基于 Simulink 的超级储能参与电网一次调频仿真研究
  • uniapp+Vue3 组件之间的传值方法
  • simpleGRPO实现分享)
  • p标签中嵌套ul
  • 产品经理的大语言模型课 03 - 定制自己的大语言模型
  • Qt 驾校考试系统项目实现
  • AWS容器化部署指南
  • 【C++】特殊类设计
  • 【CXX】6.4 CxxString — std::string
  • 第十七:go 反射
  • Spring Boot中@Valid 与 @Validated 注解的详解
  • macOS 终端优化
  • 使用DeepSeek+蓝耘快速设计网页简易版《我的世界》小游戏
  • 从0到1:JavaScript小白进阶之路
  • mapbox-gl的Popup的使用详解
  • 世界数字教育大会发布“数字教育研究全球十大热点”
  • 一种声音·阿甘本|即将到来的中世纪;“新”与“旧”……
  • 陕西榆林:全力推进榆林学院升格榆林大学
  • 通用汽车回应进口车业务调整传闻:因经济形势变化重组,致力于在中国持续发展
  • 严打金融黑灰产,今年来上海警方破获各类经济犯罪案件690余起
  • 沧州低空经济起飞:飞行汽车开启千亿赛道,通用机场布局文旅体验