您当前的位置: 首页 > 

phymat.nico

暂无认证

  • 0浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Boost库实现线程池学习及线程实现的异步调用

phymat.nico 发布时间:2017-12-08 17:08:49 ,浏览量:0

A.Boost线程池实现

参考自: Boost库实现线程池实例

原理:使用boost的thread_group存储多个线程,使用bind方法将要处理的函数转换成线程可调用的函数进行执行;使用队列存储待处理任务,利用Mutex实现队列线程安全。

复制代码
#ifndef MYTHREADPOOL_H
#define MYTHREADPOOL_H

#include 
#include 
#include 
#include 
#include 
#include 
using namespace boost;

typedef boost::function MyTask;
//任务队列--noncopyable
class MyTaskQueue : boost::noncopyable
{
private:
    std::queue m_taskQueue;
    boost::mutex m_mutex;//互斥锁
    boost::condition_variable_any m_cond;//条件变量
public:
    void push_Task(const MyTask& task){
        //加上互斥锁
        boost::unique_lock lock(m_mutex);
        m_taskQueue.push(task);
        //通知其他线程启动
        m_cond.notify_one();
    }

    MyTask pop_Task(){
        //加上互斥锁
        boost::unique_lock lock(m_mutex);
        if(m_taskQueue.empty())
        {
            //如果队列中没有任务,则等待互斥锁 
            m_cond.wait(lock);//
        }
        //指向队列首部
        MyTask task(m_taskQueue.front());
        //出队列  
        m_taskQueue.pop();
        return task;
    }
    int get_size()
    {
        return m_taskQueue.size();
    }
};

class MyThreadPool : boost::noncopyable
{
private:
    //任务队列
    MyTaskQueue m_taskQueue;
    //线程组 
    boost::thread_group m_threadGroup;
    int m_threadNum;
    /*
    volatile 被设计用来修饰被不同线程访问和修改的变量。
    volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,
    因而编译器生成的可执行码会重新从i的地址读取数据放在k中。 
    volatile可以保证对特殊地址的稳定访问,不会出错。
    */
    volatile bool is_run;
    void run(){//线程池中线程的处理函数
        while(is_run){
            //一直处理线程池的任务
            MyTask task = m_taskQueue.pop_Task();
            task();//运行bind的函数
        }
    }
public:
    MyThreadPool(int num):m_threadNum(num),is_run(false)//初始化列表
    {

    }
    ~MyThreadPool(){
        stop();
    }
    void init()
    {
        if(m_threadNum             
关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.0524s