Boost库实现线程池实例


#ifndef MY_TASK_QUEUE_H
#define	MY_TASK_QUEUE_H
#include <queue>
#include <boost/thread.hpp>
#include <boost/noncopyable.hpp>
#include <boost/function.hpp>
//using namespace boost;
//using namespace std;
typedef boost::function<void(void)> my_task;
//任务队列
class Task_queue:boost::noncopyable
{
private:
    std::queue<my_task> my_queue;
    boost::condition_variable_any cond;
    boost::mutex my_mutex;
public:
    void push_task(const my_task & task_func)
    {  //加上互斥锁
        boost::unique_lock<boost::mutex> lock(my_mutex);
        my_queue.push(task_func);
        //通知其他线程启动
        cond.notify_one();
    }
    my_task get_task(){
        //加上互斥锁
        boost::unique_lock<boost::mutex> lock(my_mutex);
        if(my_queue.size()==0)
        {
            //如果队列中没有任务,则等待互斥锁
            cond.wait(lock);
        }
        //指向队列首部
        my_task task(my_queue.front());
        //出队列
        my_queue.pop();
        return task;      
    }
    int get_size()
    {
        return my_queue.size();
    }
};

#endif	


#ifndef MY_THREAD_POOL_H
#define	MY_THREAD_POOL_H
#include <boost/thread.hpp>
#include <boost/noncopyable.hpp>
#include <boost/function.hpp>
#include "My_Task_queue.h"
#include <iostream>
using namespace std;
class My_thread_pool:boost::noncopyable
{
private:
    //线程队列
    Task_queue my_queue;
    //线程组
    boost::thread_group my_thread_group;
    int thread_num;
    volatile bool is_run;
    void run()
    {
        while(is_run)
        {
            cout<<"run "<<endl;
            //一直处理线程池的任务
            my_task task=my_queue.get_task();
            task();
        }
    }
public:
    My_thread_pool(int num):thread_num(num),is_run(false)
    {
        
    };
    ~My_thread_pool(){
    
    };
    void init()
    {
        is_run=true;
        if(thread_num<=0)
        {
            return ;
        }
        for(int i=0;i<thread_num;++i)
        {
            //生成多个线程,绑定run函数,添加到线程组
            my_thread_group.add_thread(new boost::thread(boost::bind(&My_thread_pool::run,this)));
        }
    }
    //停止线程池
    void stop()
    {
        is_run=false;
    }
    //添加任务 
    void post(const my_task &task)
    {
        my_queue.push_task(task);
    }
    void wait()
    {
        my_thread_group.join_all();
    }
              
};
#endif	

#include "My_Task_queue.h"
#include "My_thread_pool.h"
#include <iostream>
#include <cstdlib>
using namespace std;

void print_task(int i)
{
    cout<<"I am Task "<<i<<" number:"<<endl;
}
//使用boost线程池  编译参数加上-lboost_thread
int main(int argc, char** argv) {

    My_thread_pool tp(4);
    tp.init();
    
    my_task task[4];
    for(int i=0;i<4;i++)
    {
        //生成线程任务,类型为函数指针 boost::function<void(void)>
        task[i]=boost::bind(print_task,i+1);
        //放到线程池中处理
        tp.post(task[i]);
    }
    //等待线程池处理完成!
   tp.wait();
    
    return 0;
}





  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用boost实现线程池的示例代码: ```c++ #include <iostream> #include <boost/thread.hpp> #include <boost/bind.hpp> #include <boost/asio.hpp> class ThreadPool { public: ThreadPool(size_t num_threads) : work_(io_service_) { for (size_t i = 0; i < num_threads; ++i) { workers_.create_thread(boost::bind(&boost::asio::io_service::run, &io_service_)); } } ~ThreadPool() { io_service_.stop(); workers_.join_all(); } template <typename Task> void execute(Task task) { io_service_.post(task); } private: boost::asio::io_service io_service_; boost::asio::io_service::work work_; boost::thread_group workers_; }; void task1() { std::cout << "Task 1 executed in thread " << boost::this_thread::get_id() << std::endl; } void task2() { std::cout << "Task 2 executed in thread " << boost::this_thread::get_id() << std::endl; } int main() { ThreadPool pool(2); pool.execute(task1); pool.execute(task2); return 0; } ``` 在上面的示例中,我们首先定义了一个ThreadPool类,它包含了一个boost::asio::io_service对象和一个boost::thread_group对象。在ThreadPool的构造函数中,我们创建了多个工作线程,并将它们绑定到io_service对象上。execute()函数接受一个任务,并将其提交到io_service队列中。在ThreadPool的析构函数中,我们停止io_service并等待所有工作线程完成。 在main函数中,我们创建了一个ThreadPool对象,并使用execute()函数提交了两个任务任务。每个任务将打印它是在哪个线程中执行的。 请注意,这只是一个简单的示例,实际的线程池可能需要更多的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值