Linux之 线程池 | 单例模式的线程安全问题 | 其他锁

2024-04-09 1294阅读

目录

一、线程池

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 
VPS购买请点击我

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

目录[+]