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)