实现有大小限制的并发阻塞队列

本文详细介绍了如何使用 C++ 实现一个基于 list 和互斥锁的有大小限制的并发阻塞队列,包括其核心原理、代码实现以及如何处理队列满和空的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于阻塞队列,当队列满时写线程阻塞,当队列为空时读线程阻塞。使用list为基础数据结构结合互斥锁来实现有大小限制的并发阻塞队列。

 

 

#include<algorithm>
#include<list>
using namespace std;


template <typename T>
class ThreadSafeContainer
{
public:
  ThreadSafeContainer():maxSize_(1000)
  {
    pthread_mutex_init(&lock_,NULL);
    pthread_cond_init(&rcond_,NULL);
    pthread_cond_init(&wcond_,NULL);
    //list_.size(maxSize_);
  };
  ~ThreadSafeContainer()
  {
    pthread_mutex_destroy(&lock_);
    pthread_cond_destroy(&rcond_);
    pthread_cond_destroy(&wcond_);
  };




   void push(boost::shared_ptr<T> pelement)
   {
       pthread_mutex_lock(&lock_);
       const bool was_empty = list_.empty();
       while(list_.size() == maxSize_)
         {
           pthread_cond_wait(&wcond_,&lock_);
         }


       list_.push_back(pelement);
       pthread_mutex_unlock(&lock_);
       if(was_empty)
         {
           pthread_cond_broadcast(&rcond_);
         }
   }


   boost::shared_ptr<T> pop()
   {
       pthread_mutex_lock(&lock_);
       const bool was_full = (list_.size() == maxSize_);
       while(list_.empty())
         {
           pthread_cond_wait(&rcond_,&lock_);
         }


       boost::shared_ptr<T> max = list_.front();
       list_.pop_front();
       pthread_mutex_unlock(&lock_);


       if(was_full)
         pthread_cond_broadcast(&wcond_);


       return max;
   }


   int size()
   {
     return list_.size();
   }


private:
  list<boost::shared_ptr<T> > list_;
  int maxSize_;
  pthread_mutex_t lock_;
  pthread_cond_t rcond_, wcond_;
};

 

这个阻塞队列有两个条件变量而不是一个。如果队列满了,写线程等待 _wcond 条件变量;读线程在从队列中取出数据之后需要通知所有线程。同样,如果队列是空的,读线程等待 _rcond 变量,写线程在把数据插入队列中之后向所有线程发送广播消息。如果在发送广播通知时没有线程在等待 _wcond 或 _rcond,会发生什么?什么也不会发生;系统会忽略这些消息。还要注意,两个条件变量使用相同的互斥锁。

 

 

 

 

 参考网页: http://www.ibm.com/developerworks/cn/aix/library/au-multithreaded_structures1/index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值