设为首页 加入收藏

TOP

C++ 实现线程安全的任务队列
2015-07-20 17:12:15 来源: 作者: 【 】 浏览:2
Tags:实现 线程 安全 任务 队列

C++ 实现线程安全的任务队列

flyfish 2015-3-6

一、三个接口函数说明



1 add 新增任务
2 get_nonblocking 非阻塞获取任务或者空任务
3 get_blocking 阻塞获取任务
头文件
#pragma once
#include 
  
   
#include 
   
     #include 
    
      #include 
     
       //任务 网络发送任务使用的结构,通常有一个发送缓冲区和一个实际要发送的长度 class task { public: unsigned char data[2048]; unsigned int len;//实际发送长度 task::task(); task::~task(); }; class task_queue { private: std::deque
      
        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
       
         get_nonblock(); task get_block(); }; 
       
      
     
    
   
  





实现文件

#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
  
    lock(tasks_mutex);//不允许其他线程执行 
	tasks.push_back(task);
	lock.unlock();
	cv.notify_one();//通知其他线程继续
}
std::tuple
   
     task_queue::get_nonblock() { boost::lock_guard
    
      lock(tasks_mutex); std::tuple
     
       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
      
        lock(tasks_mutex); while (tasks.empty()) { cv.wait(lock); } task ret=tasks.front(); tasks.pop_front(); return ret; }
      
     
    
   
  





二 解释
1 notify_one用于唤醒一个等待该条件(condition)发生的线程
2 可以使用boost::mutex::scoped_lock 替换boost::unique_lock ,可以避免遗漏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附加一些功能




4 如果任务在获取之后不删除,就可以使用多读一写方式,就要实现读写锁


读操作发生时: 写线程停止操作,允许多个线程同时读操作
写操作发生时: 只允许同一时刻只有一个线程写操作,其他无论读写线程全部停止。
代码类似
typedef boost::shared_lock
   
     r_lock; 
typedef boost::unique_lock
    
      w_lock; boost::shared_mutex mutex_; void read() { r_lock lock(mutex_); //do something } void write() { w_lock lock(mutex_); //do something }
    
   

?

?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu 2553 N皇后问题 经典搜索,DF.. 下一篇uva 10670 Work Reduction (贪心..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·有没有哪些高效的c++ (2025-12-27 08:20:57)
·Socket 编程时 Accep (2025-12-27 08:20:54)
·计算机网络知识点总 (2025-12-27 08:20:52)
·一篇说人话的文章, (2025-12-27 07:50:09)
·Python Web框架哪家 (2025-12-27 07:50:06)