在多线程编程中,线程池是一种常用的并发模式,它能有效管理线程资源,避免频繁创建和销毁线程带来的开销。本文将带领你从零设计并实现一个Linux下的线程池,并引入单例模式来确保线程池的唯一性。无论你是并发编程新手还是希望巩固知识的开发者,都能从中受益。
在Linux系统中,使用pthread创建线程虽然轻量,但如果任务频繁且短暂,反复创建销毁线程会消耗大量CPU和内存资源。线程池维护一组预先创建的线程,等待分配任务,从而降低开销并提高响应速度。此外,线程池还能控制并发线程数量,防止系统过载。
一个基础的线程池需要以下组件:
在很多应用中,线程池应该是全局唯一的,例如数据库连接池、日志处理等。此时,单例模式能确保线程池类只有一个实例,并提供全局访问点。在C++中,可以使用局部静态变量(C++11起线程安全)或双重检查锁实现。我们将在实现中采用简单且线程安全的局部静态变量方式。
图:线程池基本结构(任务队列+工作线程)
下面我们逐步实现一个线程池,并应用单例模式。为简化,使用C++11标准,但线程操作仍使用pthread(Linux原生)。
struct Task { void (function)(void); void* arg;}; class ThreadPool {public: static ThreadPool& getInstance(int numThreads = 4) { static ThreadPool instance(numThreads); return instance; } void addTask(Task task); ~ThreadPool();private: ThreadPool(int numThreads); ThreadPool(const ThreadPool&) = delete; ThreadPool& operator=(const ThreadPool&) = delete; static void* worker(void* arg); void run(); std::vector threads; std::queue taskQueue; pthread_mutex_t mutex; pthread_cond_t cond; bool stop;}; ThreadPool::ThreadPool(int numThreads) : stop(false) { pthread_mutex_init(&mutex, NULL); pthread_cond_init(&cond, NULL); for (int i = 0; i < numThreads; ++i) { pthread_t tid; pthread_create(&tid, NULL, worker, this); threads.push_back(tid); }}void* ThreadPool::worker(void* arg) { ThreadPool* pool = static_cast(arg); pool->run(); return NULL;}void ThreadPool::run() { while (true) { pthread_mutex_lock(&mutex); while (taskQueue.empty() && !stop) { pthread_cond_wait(&cond, &mutex); } if (stop && taskQueue.empty()) { pthread_mutex_unlock(&mutex); break; } Task task = taskQueue.front(); taskQueue.pop(); pthread_mutex_unlock(&mutex); task.function(task.arg); // 执行任务 }}void ThreadPool::addTask(Task task) { pthread_mutex_lock(&mutex); taskQueue.push(task); pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex);}ThreadPool::~ThreadPool() { pthread_mutex_lock(&mutex); stop = true; pthread_cond_broadcast(&cond); pthread_mutex_unlock(&mutex); for (pthread_t tid : threads) { pthread_join(tid, NULL); } pthread_mutex_destroy(&mutex); pthread_cond_destroy(&cond);} void printInt(void* arg) { int* num = static_cast(arg); printf("任务执行: %d", *num);}int main() { ThreadPool& pool = ThreadPool::getInstance(4); int values[10] = {1,2,3,4,5,6,7,8,9,10}; for (int i = 0; i < 10; ++i) { Task task = {printInt, &values[i]}; pool.addTask(task); } sleep(1); // 等待任务完成(实际应用需要更完善的同步) return 0;} 上述实现中,getInstance使用了C++11的魔法静态变量(Meyers" Singleton),编译器保证静态局部变量的初始化是线程安全的,无需额外加锁。这是实现单例模式最简洁且高效的方式。
至此,我们完成了一个支持Linux线程池的简单实现,并结合单例模式确保全局唯一。你可以在此基础上添加动态调整线程数、任务优先级、返回结果等功能。理解这些基础后,你可以进一步学习C++的std::thread和std::async,或者更高级的并发库。
本文关键词:Linux线程池、线程池设计、单例模式、并发编程
本文由主机测评网于2026-02-24发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20260227010.html