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
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
