自己编写的简单的线程池

8 篇文章 0 订阅
7 篇文章 0 订阅

利用C++11的std::thread,实现生产消费模型。

/*任务接口*/
#ifndef _ITASK_HEAD_
#define _ITASK_HEAD_
class ITask
{
public:
    ITask(void *arg = nullptr) :m_arg(arg)
    {
    }
    virtual ~ITask()
    {
    }
    void SetArg(void *arg)
    {
        m_arg = arg;
    }
    virtual void process() = 0;

protected:
    void *m_arg;
};
#endif

/*任务*/
#ifndef _MYTASK_HEAD_
#define _MYTASK_HEAD_
#include "ITask.h"

class MyTask :public ITask
{
public:
    MyTask();
    virtual ~MyTask();
    virtual void process();
};
#endif

#include "MyTask.h"
#include <iostream>

using namespace std;

MyTask::MyTask()
{
}

MyTask::~MyTask()
{
}

void MyTask::process()
{
    cout << "Process Task:" << *(int*)m_arg<< endl;
    delete m_arg;
    m_arg = nullptr;
}

/*线程池*/
#ifndef _THREADPOOL_HEAD_
#define _THREADPOOL_HEAD_
#include "ITask.h"
#include <mutex>
#include <condition_variable>
#include <vector>
#include <map>
#include <thread>

class ThreadPool
{
public:
    ThreadPool(int maxThreadCount = 100, int coreThreadCount = 3);
    ~ThreadPool();
    void AddTask(ITask* task);	
    void join();

private:
    void Init();
    void ThreadFunc();

private:
    int m_maxThreadCount;
    int m_coreThreadCount;
    int m_currentThreadCount;
    int m_idleThreadCount;
    std::mutex m_mutex;
    std::condition_variable m_cond;
    std::map<std::thread::id,std::thread*> m_threads;
    std::vector<ITask*> m_tasks; // 任务队列

    const double m_threshold = 0.5;	
};
#endif

/*线程池实现*/
#include "ThreadPool.h"
#include <thread>

using namespace std;

ThreadPool::ThreadPool(int maxThreadCount, int coreThreadCount) 
            :m_maxThreadCount(maxThreadCount),
            m_coreThreadCount(coreThreadCount),
             m_currentThreadCount(0),
             m_idleThreadCount(0)
{
    Init();
}

ThreadPool::~ThreadPool()
{
}

void ThreadPool::Init()
{
    unique_lock<mutex> lock(m_mutex);
    m_coreThreadCount = m_maxThreadCount < m_coreThreadCount ? m_maxThreadCount : m_coreThreadCount;
    for (int i = 0; i < m_coreThreadCount; i++)
    {
        thread *th = new thread(&ThreadPool::ThreadFunc, this);
        m_threads.insert(make_pair(th->get_id(),th));
        m_currentThreadCount++;
    }
}

void ThreadPool::AddTask(ITask *task)
{
    unique_lock<mutex> lock(m_mutex);
    m_tasks.push_back(task);
    if (m_idleThreadCount > 0)
    {
        m_cond.notify_one();
    }
    else if (m_currentThreadCount < m_maxThreadCount)
    {
        thread *th = new thread(&ThreadPool::ThreadFunc, this);
        m_threads.insert(make_pair(th->get_id(),th));
        m_currentThreadCount++;
    }	
}

void ThreadPool::join()
{
    for (auto th : m_threads)
    {
        th.second->join();
    }
}

void ThreadPool::ThreadFunc()
{
    while (1)
    {
        unique_lock<mutex> lock(m_mutex);
        while (m_tasks.empty())
        {
            m_idleThreadCount++;
            if (m_idleThreadCount > m_threshold * m_currentThreadCount
                && m_currentThreadCount > m_coreThreadCount)
            {
                //auto iter = m_threads.find(std::this_thread::get_id());
                //delete iter->second; 怎么释放thread对象呢?
                //m_threads.erase(iter);
                m_idleThreadCount--;
                m_currentThreadCount--;
                return;
            }			
            m_cond.wait(lock);
            m_idleThreadCount--;
        }
        ITask *task = *(m_tasks.begin());
        m_tasks.erase(m_tasks.begin());
        lock.unlock();

        task->process();
        delete task;
        task = nullptr;
    }	
}

/*测试*/
#include "ThreadPool.h"
#include "MyTask.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    ThreadPool pool;
    for (int i = 0; i < 20; i++)
    {
        MyTask* task = new MyTask();

        task->SetArg(new int(i));

        pool.AddTask(task);
    }
    pool.join();

    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个基本的线程池实例代码,它可以执行一些简单的任务: ```java import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ThreadPoolExample { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(5); for (int i = 0; i < 10; i++) { Runnable worker = new WorkerThread("Task " + (i + 1)); executor.execute(worker); } executor.shutdown(); while (!executor.isTerminated()) { } System.out.println("All tasks completed"); } } class WorkerThread implements Runnable { private String taskName; public WorkerThread(String taskName) { this.taskName = taskName; } @Override public void run() { System.out.println(Thread.currentThread().getName() + " Start. Task = " + taskName); processTask(); System.out.println(Thread.currentThread().getName() + " End."); } private void processTask() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } @Override public String toString() { return this.taskName; } } ``` 这个例子中,我们创建了一个固定大小的线程池,大小为5个线程。然后我们创建10个任务,每个任务都是一个实现了Runnable接口的WorkerThread对象,并将它们提交到线程池中执行。每个任务都会在一个新的线程中执行,直到所有任务都完成后,我们关闭线程池。 WorkerThread类实现了Runnable接口,并在run()方法中执行了一些任务。在这个例子中,我们简单地让线程休眠2秒钟。当任务完成时,我们打印一条消息来指示任务已经完成。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值