多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php框架 > 框架設(shè)計(jì) > C++ 實(shí)現(xiàn)線程安全的任務(wù)隊(duì)列

C++ 實(shí)現(xiàn)線程安全的任務(wù)隊(duì)列

來(lái)源:程序員人生   發(fā)布時(shí)間:2015-03-20 09:07:00 閱讀次數(shù):5104次

C++ 實(shí)現(xiàn)線程安全的任務(wù)隊(duì)列

flyfish 2015⑶⑹

1、3個(gè)接口函數(shù)說(shuō)明



1 add 新增任務(wù)
2 get_nonblocking 非阻塞獲得任務(wù)或空任務(wù)
3 get_blocking 阻塞獲得任務(wù)
頭文件
#pragma once #include <deque> #include <boost/thread/mutex.hpp> #include <boost/thread/locks.hpp> #include <boost/thread/condition_variable.hpp> //任務(wù) 網(wǎng)絡(luò)發(fā)送任務(wù)使用的結(jié)構(gòu),通常有1個(gè)發(fā)送緩沖區(qū)和1個(gè)實(shí)際要發(fā)送的長(zhǎng)度 class task { public: unsigned char data[2048]; unsigned int len;//實(shí)際發(fā)送長(zhǎng)度 task::task(); task::~task(); }; class task_queue { private: std::deque<task> tasks; boost::mutex tasks_mutex; boost::condition_variable cv; public: task_queue::task_queue(); task_queue::~task_queue(); void add(const task& task); std::tuple<bool,task> get_nonblock(); task get_block(); };





實(shí)現(xiàn)文件

#include "task_queue.h" //task task::task() { for (int i=0;i<2048;i++) data[i] = 0; } task::~task() { } // task queue task_queue::task_queue() { } task_queue::~task_queue() { } void task_queue::add(const task& task) { boost::unique_lock<boost::mutex> lock(tasks_mutex);//不允許其他線程履行 tasks.push_back(task); lock.unlock(); cv.notify_one();//通知其他線程繼續(xù) } std::tuple<bool,task> task_queue::get_nonblock() { boost::lock_guard<boost::mutex> lock(tasks_mutex); std::tuple<bool,task> ret; if (!tasks.empty()) { ret=std::make_tuple(true,tasks.front()); tasks.pop_front(); } else { task tmp; ret=std::make_tuple(false,tmp); } return ret; } task task_queue::get_block() { boost::unique_lock<boost::mutex> lock(tasks_mutex); while (tasks.empty()) { cv.wait(lock); } task ret=tasks.front(); tasks.pop_front(); return ret; }





2 解釋
1 notify_one用于喚醒1個(gè)等待該條件(condition)產(chǎn)生的線程
2 可使用boost::mutex::scoped_lock 替換boost::unique_lock<boost::mutex>,可以免遺漏unlock
例如
boost::mutex mutex_; try { mutex_.lock(); //do something mutex_.unlock(); } catch(...) { mutex_.unlock(); return 0; }


使用boost::mutex::scoped_lock就能夠避免catch遺漏unlock


3 boost::unique_lock僅僅比boost::lock_guard附加1些功能




4 如果任務(wù)在獲得以后不刪除,就能夠使用多讀1寫(xiě)方式,就要實(shí)現(xiàn)讀寫(xiě)鎖


讀操作產(chǎn)生時(shí): 寫(xiě)線程停止操作,允許多個(gè)線程同時(shí)讀操作
寫(xiě)操作產(chǎn)生時(shí): 只允許同1時(shí)刻只有1個(gè)線程寫(xiě)操作,其他不管讀寫(xiě)線程全部停止。
代碼類(lèi)似
typedef boost::shared_lock<boost::shared_mutex> r_lock; typedef boost::unique_lock<boost::shared_mutex> w_lock; boost::shared_mutex mutex_; void read() { r_lock lock(mutex_); //do something } void write() { w_lock lock(mutex_); //do something }

以上程序在VC2010 Boost庫(kù)下編譯通過(guò)


生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 爱色aⅴ| 精品国产精品 | 噜噜影院 | 欧美日韩福利视频一区二区三区 | 欧美一级毛片免费高清aa | www.操你| 成人国产在线24小时播放视频 | 国产精品精品 | 香蕉福利视频 | 久夜色精品国产一区二区三区 | 欧美日在线 | 涩涩五月天婷婷丁香综合社区 | 狠狠躁| 中文乱码视亚洲 | 欧美一级淫片漂亮的老师 | 免费观看黄色的网站 | 成人春色在线观看免费网站 | 中文字幕在线国产 | 日本一区二区三区在线观看视频 | 中文字幕在线影院 | 欧美另类videosbestsex高清 | 国产精品嫩草影院人体模特 | 一级特黄aa大片一又好看 | 日韩在线观看一区 | 欧美一区二区三区日韩免费播 | 国产精品视频永久免费播放 | 国产精品欧美视频另类专区 | 图片小说区| 久久亚洲精品成人 | 中文字幕亚洲综合久久202 | 久久久久一区二区三区 | 秋霞特色aa大片在线观看 | 亚洲欧美综合精品成 | 在线观看日本一区 | 国产a一级 | 最近中文字幕国语免费高清6 | 亚洲一区第一页 | 可以在线观看的黄色网址 | 午夜啪啪网 | 欧美精品一区二区三区免费观看 | 中文字幕国产在线 |