日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Boost库实现线程池学习及线程实现的异步调用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

A.Boost線程池實現(xiàn)

參考自:?Boost庫實現(xiàn)線程池實例

原理:使用boost的thread_group存儲多個線程,使用bind方法將要處理的函數(shù)轉(zhuǎn)換成線程可調(diào)用的函數(shù)進行執(zhí)行;使用隊列存儲待處理任務(wù),利用Mutex實現(xiàn)隊列線程安全。

#ifndef MYTHREADPOOL_H #define MYTHREADPOOL_H#include <iostream> #include <queue> #include <boost/bind.hpp> #include <boost/thread.hpp> #include <boost/function.hpp> #include <boost/noncopyable.hpp> using namespace boost;typedef boost::function<void(void)> MyTask; //任務(wù)隊列--noncopyable class MyTaskQueue : boost::noncopyable { private:std::queue<MyTask> m_taskQueue;boost::mutex m_mutex;//互斥鎖boost::condition_variable_any m_cond;//條件變量 public:void push_Task(const MyTask& task){//加上互斥鎖boost::unique_lock<boost::mutex> lock(m_mutex);m_taskQueue.push(task);//通知其他線程啟動 m_cond.notify_one();}MyTask pop_Task(){//加上互斥鎖boost::unique_lock<boost::mutex> lock(m_mutex);if(m_taskQueue.empty()){//如果隊列中沒有任務(wù),則等待互斥鎖 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://任務(wù)隊列 MyTaskQueue m_taskQueue;//線程組 boost::thread_group m_threadGroup;int m_threadNum;/*volatile 被設(shè)計用來修飾被不同線程訪問和修改的變量。volatile 告訴編譯器i是隨時可能發(fā)生變化的,每次使用它的時候必須從i的地址中讀取,因而編譯器生成的可執(zhí)行碼會重新從i的地址讀取數(shù)據(jù)放在k中。 volatile可以保證對特殊地址的穩(wěn)定訪問,不會出錯。*/volatile bool is_run;void run(){//線程池中線程的處理函數(shù)while(is_run){//一直處理線程池的任務(wù)MyTask task = m_taskQueue.pop_Task();task();//運行bind的函數(shù) }} public:MyThreadPool(int num):m_threadNum(num),is_run(false)//初始化列表 {}~MyThreadPool(){stop();}void init(){if(m_threadNum <= 0) return;is_run = true;for (int i=0;i<m_threadNum;i++){//生成多個線程,綁定run函數(shù),添加到線程組 m_threadGroup.add_thread(new boost::thread(boost::bind(&MyThreadPool::run,this)));}}//停止線程池void stop(){is_run = false;}//添加任務(wù)void AddNewTask(const MyTask& task){m_taskQueue.push_Task(task);}void wait(){m_threadGroup.join_all();//等待線程池處理完成! } };typedef void (*pFunCallBack)(int i); void CallBackFun(int i) {std::cout << i <<" call back!"<<std::endl; }void ProcFun(int ti,pFunCallBack callback) {std::cout<<"I am Task "<<ti<<std::endl; //taskfor (int i=0;i<ti*100000000;i++){i*i;}if(callback != NULL)callback(ti); }void CallBackFun2(int i) {std::cout << i <<" call back! v2"<<std::endl; }int ProcFun2(int& ti) {std::cout<<"I am Task "<<ti<<std::endl; //taskfor (int i=0;i<ti*100000000;i++){i*i;}return ti; }void testThreadPool() {MyThreadPool tp(2);int taskNum = 4;for (int i=0;i<taskNum;i++){MyTask task = boost::bind(ProcFun,i+1,CallBackFun);//放到線程池中處理,bind(f , i) will produce a "nullary" function object that takes no arguments and returns f(i),調(diào)用時,可傳遞任何類型的函數(shù)及參數(shù)!!! tp.AddNewTask(task);}tp.init();//等待線程池處理完成! tp.wait(); }#endif

?B.基于線程的異步調(diào)用實現(xiàn)

原理:使用線程實現(xiàn)異步調(diào)用,將耗時的操作放在線程中執(zhí)行,待其執(zhí)行完成后,調(diào)用回調(diào)函數(shù)執(zhí)行后續(xù)操作。

//創(chuàng)建一個線程,執(zhí)行耗時操作,等到操作完成,調(diào)用回調(diào)函數(shù) void testAsyncCall(int i,pFunCallBack callfun) {boost::thread th(boost::bind(ProcFun,i,callfun)); } void testAsyncCall2(int i) {//bind函數(shù)嵌套,回調(diào)函數(shù) --bind(f, bind(g, _1))(x); // f(g(x)) boost::thread th(boost::bind(CallBackFun2,boost::bind(ProcFun2,i))); }template <class ParaType,class RetType> class MyTask2{typedef boost::function<RetType(ParaType&)> ProcFun;typedef boost::function<void(RetType)> CallBackFun; protected:ProcFun m_procFun;CallBackFun m_callbackFun; public:MyTask2():m_procFun(NULL),m_callbackFun(NULL){}MyTask2(ProcFun proc,CallBackFun callback):m_procFun(proc),m_callbackFun(callback){}~MyTask2(){}void Run(ParaType& para){if(m_procFun!=NULL && m_callbackFun!=NULL){m_callbackFun(m_procFun(para));}} };void testAsyncCall3(int para)//使用bind注冊執(zhí)行函數(shù)和回調(diào)函數(shù) {MyTask2<int,int> tk(ProcFun2, CallBackFun2);//tk.Run(para);MyTask task = boost::bind(&MyTask2<int,int>::Run,tk,para);boost::thread th(task);//boost::thread th(boost::bind(&MyTask2<int,int>::Run,tk,para)); }

?


總結(jié)

以上是生活随笔為你收集整理的Boost库实现线程池学习及线程实现的异步调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久草精品国产 | 日韩一区二区精品 | 日韩欧美精品在线播放 | www插插 | 日韩精品一区在线播放 | 亚洲国产精品久久久久爰性色 | 久久手机免费视频 | 学生调教贱奴丨vk | 午夜视频a | 国产精品无码免费专区午夜 | 中文字幕乱码av | 国产欧美日韩一区二区三区 | 光溜溜视频素材大全美女 | 激情四射网 | 大地资源二中文在线影视免费观看 | 亚洲精品国产精品国自产观看 | 日韩欧美一区二区三区久久婷婷 | 亚洲aaa | 亚洲人成无码网站久久99热国产 | 日本小视频网站 | 久久影院视频 | 丝袜熟女一区二区 | 天天综合中文字幕 | 啪啪综合 | 性做久久久久久免费观看欧美 | 男人天堂成人 | 欧美精品一区二区在线播放 | 中文字幕av在线播放 | 国产av 一区二区三区 | 免费激情网址 | 亚洲特黄特色 | 午夜精品久久久久久久久久久久 | 孕妇疯狂做爰xxxⅹ 国产精品乱码久久久久久 99久久久成人国产精品 | 欧美福利一区二区三区 | 亚洲国产97在线精品一区 | 亚洲综合色小说 | 男人天堂新地址 | 亚洲一区二区三区影院 | 91免费看大片 | 日韩少妇裸体做爰视频 | 九九九精品视频 | 国产,日韩,欧美 | 中文字幕欧美在线观看 | 性欧美videos高清hd4k | 在线午夜av | 日韩女女同性aa女同 | 国产精九九网站漫画 | 国产欧美在线一区 | 国内久久精品视频 | 黄色三级a | yw视频在线观看 | 国产精品久久色 | 国产精品揄拍一区二区 | 国产欧美久久一区二区三区 | 91精品国产综合久久久蜜臀图片 | 精品一区二区三区在线观看视频 | 久久伊人超碰 | 日本女人毛茸茸 | 日本xxxxxxxxx18| 网爆门在线 | 精品少妇人妻av一区二区 | 欧美人一级淫片a免费播放 西方av在线 | 久久视频在线免费观看 | 欧美性一级 | a黄色大片| 亚洲av电影一区二区 | 国产豆花视频 | 国产伦精品一区二区三区免.费 | 亚洲国产精品无码久久久久高潮 | 五月婷婷在线观看视频 | 国产视频在线免费观看 | 日韩一级欧美一级 | 国产区一区二区三区 | 欧美大片在线免费观看 | 性五月天 | 鲁一鲁色一色 | 加勒比在线一区 | 一级少妇女片 | 亚洲精品无人区 | 岛国av片| 饥渴少妇色诱水电工 | 亚洲精选在线观看 | 青青草视频污 | 天天弄 | 亚洲一区二区在线 | 毛片毛片毛片毛片毛片毛片 | 久久精品噜噜噜成人 | 一区二区三区免费在线视频 | 国产视频手机在线播放 | 成人免费视频a | 五月天激情在线 | 国产精品久久久久久久久久久久久久久久久久 | 国产在线xxx | 插插看看 | 蜜臀尤物一区二区三区直播 | 国产精品无码一区二区三区免费 | 国产欧美一区二区在线 | 少妇光屁股影院 | 亚洲精品888 |