Linux之 线程池 | 单例模式的线程安全问题 | 其他锁
目录
一、线程池
1、线程池
2、线程池代码
3、线程池的应用场景
二、单例模式的线程安全问题
1、线程池的单例模式
2、线程安全问题
三、其他锁
一、线程池
1、线程池
线程池是一种线程使用模式。线程池里面可以维护一些线程。
为什么要有线程池?
因为在我们使用线程去处理各种任务的时候,尤其是一些执行时间短的任务,我们必须要先对线程进行创建然后再进行任务处理,最后再销毁线程,效率是比较低的。而且有的时候线程过多会带来调度开销,进而影响缓存局部性和整体性能。
于是,我们可以通过线程池预先创建出一批线程,线程池维护着这些线程,线程等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。
线程池不仅能够保证内核的充分利用,还能防止过分调度。
2、线程池代码
我们先对线程进行封装:Thread.hpp
#pragma once #include #include #include #include using namespace std; typedef void *(*fun_t)(void *); class ThreadData { public: void *arg_; string name_; }; class Thread { public: Thread(int num, fun_t callback, void *arg) : func_(callback) { char buffer[64]; snprintf(buffer, sizeof(buffer), "Thread-%d", num); name_ = buffer; tdata_.name_ = name_; tdata_.arg_ = arg; } void start() { pthread_create(&tid_, nullptr, func_, (void *)&tdata_); } void join() { pthread_join(tid_, nullptr); } string &name() { return name_; } ~Thread() { } private: pthread_t tid_; string name_; fun_t func_; ThreadData tdata_; };
线程池代码:threadPool.hpp:
#pragma once #include #include #include "thread.hpp" #define THREAD_NUM 3 template class ThreadPool { public: bool Empty() { return task_queue_.empty(); } pthread_mutex_t *getmutex() { return &lock; } void wait() { pthread_cond_wait(&cond, &lock); } T gettask() { T t = task_queue_.front(); task_queue_.pop(); return t; } public: ThreadPool(int num = THREAD_NUM) : num_(num) { for (int i = 0; i arg_; while (true) { T task; { pthread_mutex_lock(tp->getmutex()); while (tp->Empty()) tp->wait(); task = tp->gettask(); pthread_mutex_unlock(tp->getmutex()); } cout
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。