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

04-09 1290阅读

目录

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 

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]