Linux线程(3)--线程池

线程池

线程池是一种对线程进行管理的一种机制,其线程创建释放和获取任务均由线程池来完成,如果一个应用需要频繁的创建线程处理任务,如果不对线程加以现存限制,当任务爆发时可能会因为内存不足造成瘫痪,另外线程的创建和释放需要成本,线程数量增多后线程的调度也会变慢。因此当每个线程处理时间特别段或者需要对线程的数量加以限制时可以使用线程池。
在这实现一个简单的固定数量的线程加任务队列的一个线程池

#include <iostream>
#include <pthread.h>
#include <queue>
#include <unistd.h>

#define THREAD_AMOUNT_MAX 5
class Task
{
public:
    Task(int num = 0)
        :num_(num)
    {}
    Task(const Task & t)
    {
        num_ = t.num_;
    }
    void SetNum(int num)
    {
        num_ = num;
    }
    void run()
    {
        sleep(1);
        std::cout << "[" << pthread_self() << "]:" <<num_ << std::endl;
    }
private:
    int num_;
};

class ThreadPool
{
public:
    ThreadPool(int num = THREAD_AMOUNT_MAX)
        :thread_amount_(num)
        ,hangup_amount_(0)
    {
        pthread_mutex_init(&mutex_, NULL);
        pthread_cond_init(&cond_, NULL);
    }
    void InitThreadPool()
    {
        for(int i = 0; i < thread_amount_; ++i)
        {
            pthread_t tid_;
            pthread_create(&tid_, NULL, start_rounte, this);
        }
    }
    void TaskPush(Task & task)
    {
        LockQueue();
        if(hangup_amount_ > 0)
        {
            RouseOneThread();
        }
        task_queue_.push(task);
        UnLockQueue();
    }
    ~ThreadPool()
    {
        pthread_mutex_destroy(&mutex_);
        pthread_cond_destroy(&cond_);
    }
private:
    void TaskPop(Task & task)
    {
        task = task_queue_.front();
        task_queue_.pop();
    }
    void RouseOneThread()
    {
        pthread_cond_signal(&cond_);
    }
    void LockQueue()
    {
        pthread_mutex_lock(&mutex_);
    }
    void UnLockQueue()
    {
        pthread_mutex_unlock(&mutex_);
    }
    bool TaskIsEmpty()
    {
        return task_queue_.empty();
    }
    static void * start_rounte(void * arg)
    {
        ThreadPool *tp = static_cast<ThreadPool *>(arg);
        pthread_detach(pthread_self());
        for(;;)
        {
            tp->LockQueue();
            //使用while因为此时如果有一个线程刚好获得锁然后任务队列
            //添加了任务并且唤醒了另一个线程,会造成两个线程共同取
            //任务
            while(tp->TaskIsEmpty())  
            {
                tp->ThreadHangup();
            }
            Task task_;
            tp->TaskPop(task_);
            tp->UnLockQueue();
            task_.run();    
        }
    }

    void ThreadHangup()
    {
        ++hangup_amount_;
        pthread_cond_wait(&cond_, &mutex_);
        --hangup_amount_;
    }

private:
    std::queue<Task> task_queue_;  
    pthread_mutex_t mutex_;  
    pthread_cond_t cond_;
    int thread_amount_;    
    int hangup_amount_;	   
};
#include "thread_pool.hpp"

void test()
{
    ThreadPool * tp = new ThreadPool();
    tp->InitThreadPool();
    Task t(0);
    for(int i = 1; i < 100; ++i)
    {
        t.SetNum(i);
        tp->TaskPush(t);
        sleep(1);
    }
    while(1)
    {
        ;
    }
}

int main()
{
    test();
    return 0;
}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中,使用线程池可以通过使用pthread库来实现。pthread库是一个用于多线程编程的库,提供了创建、管理和同步线程的函数。以下是在Linux中使用线程池的一般步骤: 1. 包含pthread.h头文件:在你的代码文件中,需要包含pthread.h头文件以使用pthread库的函数和数据类型。 2. 创建线程池:使用pthread_create()函数创建一个线程池,可以指定线程的数量。 3. 定义任务函数:为线程池中的每个线程定义一个任务函数,用于执行具体的任务。 4. 初始化线程池:在主线程中调用pthread_create()函数创建线程池,并初始化线程池的相关参数。 5. 分发任务:将任务分发给线程池中的空闲线程。可以使用条件变量来实现任务的分发和线程的等待。 6. 执行任务:线程池中的线程会执行分发的任务函数。 7. 等待任务完成:使用pthread_join()函数等待所有线程完成任务。 8. 销毁线程池:在任务完成后,使用pthread_exit()函数退出线程,并释放线程池的资源。 需要注意的是,在使用线程池时,要根据具体的应用场景和需求来设置线程池的大小和任务分发策略,以确保线程池的有效利用和系统的性能优化。 总结起来,在Linux中使用线程池可以通过pthread库来实现,步骤包括包含pthread.h头文件、创建线程池、定义任务函数、初始化线程池、分发任务、执行任务、等待任务完成和销毁线程池。 [2 [3<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Linux —— 线程池](https://blog.csdn.net/sjsjnsjnn/article/details/126364511)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [< Linux > 多线程(线程池)](https://blog.csdn.net/bit_zyx/article/details/129518637)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值