# PthreadPool **Repository Path**: giteexiaohao/PthreadPool ## Basic Information - **Project Name**: PthreadPool - **Description**: 线程池是一种预先创建一组固定数量线程并复用的并发编程模式,核心目的是解决「频繁创建 / 销毁线程的性能开销」和「线程数量失控导致的系统资源耗尽」问题,是服务端 / 高并发场景的核心基础组件。 - **Primary Language**: C++ - **License**: MulanPSL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-28 - **Last Updated**: 2025-11-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PthreadPool #### 介绍 线程池是一种预先创建一组固定数量线程并复用的并发编程模式,核心目的是解决「频繁创建/销毁线程的性能开销」和「线程数量失控导致的系统资源耗尽」问题,是服务端/高并发场景的核心基础组件。 本项目基于 POSIX pthread 库实现轻量级 C++ 线程池,封装了 Cond(条件变量)、Mutex(互斥锁)、Thread(线程)核心模块,并集成线程安全的日志系统(支持单文件/多模块拆分日志),可直接用于 Linux 平台的并发编程场景。 #### 软件架构 1. **核心模块分层**: - 基础层:Mutex.hpp(互斥锁封装)、Cond.hpp(条件变量封装)→ 提供线程同步基础能力; - 核心层:Thread.hpp(线程封装)→ 封装 pthread 线程的创建、启动、销毁; - 业务层:ThreadPool.hpp(线程池核心)→ 实现任务队列、线程复用、任务分发; - 工具层:Log.hpp(日志模块)→ 支持控制台/文件输出、按模块区分日志、时间戳/进程ID/文件行号溯源。 2. **设计模式**: - 线程池采用「生产者-消费者模型」:主线程提交任务(生产者),线程池内线程消费任务(消费者); - 日志模块采用「策略模式」:统一接口封装控制台/文件/(预留)网络日志输出策略。 3. **依赖说明**: - 底层依赖:Linux pthread 库(POSIX 标准); - 编译标准:C++17 及以上(需支持 std::unique_ptr、std::filesystem 等特性)。 #### 安装教程 1. **环境要求**: - 操作系统:Linux(Ubuntu/CentOS 等,支持 pthread 库); - 编译工具:g++ (7.5+) / clang++; - 依赖库:pthread(系统默认自带,编译时需显式链接)。 2. **拉取代码**: git clone https://gitee.com/giteexiaohao/PthreadPool.git cd PthreadPool #### 编译项目 1. **编译单元测试**:(链接 pthread 库,指定 C++17 标准) g++ -o test_thread_pool test_thread_pool.cc -lpthread -std=c++17 2. **单元测试运行**: ./test_thread_pool #### 使用说明 1. **创建线程池**: ```c++ // 创建线程池,指定线程数量 ThreadPool pool(4); ``` 2. **提交任务**: ```c++ // 定义任务函数 void task(int i) { std::cout << "task " << i << " running in thread " << std::this_thread::get_id() << std::endl; } // 向线程池提交任务 for (int i = 0; i < 10; ++i) { pool.submit(task, i); } ``` 3. **等待任务完成**: ```c++ // 等待所有任务完成 pool.wait(); ``` 4. **日志模块**: ```c++ // 日志模块默认输出到控制台 LOG_INFO << "Hello, world!"; // 日志模块输出到文件 LOG_INFO << "Hello, world!" << LOG_FILE("log.txt"); // 日志模块按模块区分输出 LOG_INFO << "Hello, world!" << LOG_MODULE("module1"); LOG_INFO << "Hello, world!" << LOG_MODULE("module2"); // 日志模块输出时间戳/进程ID/文件行号 LOG_INFO << "Hello, world!" << LOG_TIMESTAMP << LOG_PID << LOG_FILE_LINE; ```