网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月09日漏签0天
c语言吧 关注:798,960贴子:4,358,439
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 3回复贴,共1页
<<返回c语言吧
>0< 加载中...

求助请问有没有关于阻塞队列的详细解释?

  • 只看楼主
  • 收藏

  • 回复
  • inc星际苍穹
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我在尝试实现的时候
empty()
size()
等接口 , 实现起来很困难,有数据不准确的问题
这是什么原因造成的呢


  • GTA小鸡
  • 吧主
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
没有正确实现同步机制,需要使用信号量、条件变量等机制对临界区的操作加锁。


2025-08-09 05:34:36
广告
不感兴趣
开通SVIP免广告
  • inc星际苍穹
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
代码如下——
#pragma once
#include <queue>
#include <pthread.h>
const int BLOCKING_QUEUE_DEFAULT_CAPACITY = 32;
template<class T>
class BlockingQueue
{
private:
using self_t = BlockingQueue<T>;
public:
using size_type=typename std::queue<T>::size_type;
public:
BlockingQueue(size_type capacity = BLOCKING_QUEUE_DEFAULT_CAPACITY)
:capacity_(capacity)
{
pthread_mutex_init(&mtx_,nullptr);
pthread_cond_init(&not_full_,nullptr);
pthread_cond_init(&not_empty_,nullptr);
}
// 禁用拷贝和拷贝赋值
BlockingQueue(const self_t&) = delete;
self_t&operator = (const self_t&) = delete;
//禁用移动构造和赋值
BlockingQueue(self_t&&other)noexcept = delete;
self_t operator = (self_t&&other)noexcept = delete;
//析构函数
virtual~BlockingQueue()
{
this->capacity_ = BLOCKING_QUEUE_DEFAULT_CAPACITY;
pthread_mutex_destroy(&mtx_);
pthread_cond_destroy(&not_full_);
pthread_cond_destroy(&not_empty_);
}
private:
bool is_empty()const noexcept
{
return bq_.size()==0;
}
bool is_full()const noexcept
{
return this->bq_.size()==this->capacity_;
}
public:
void push(const T &val)
{
// 先申请mtx
pthread_mutex_lock(&mtx_);
// 等待条件 满足
while(this->is_full())
{
// 释放锁并等待条件
pthread_cond_wait(&not_full_,&mtx_);
}
// 条件满足并已加锁
bq_.push(val);
//唤醒一个消费者 告诉消费者队列不为空
pthread_cond_signal(&not_empty_);
// 释放锁
pthread_mutex_unlock(&mtx_);
}
void pop(T* out=nullptr)
{
//先申请互斥锁
pthread_mutex_lock(&mtx_);
// 加锁检测条件
while(this->is_empty())
{
pthread_cond_wait(&not_empty_,&mtx_);
}
// 条件满足并已加锁 , 消费一个数据
if(out)
*out=bq_.front();// 取出队列的一个数据
bq_.pop();
// 通知生产者可以继续生产
pthread_cond_signal(&not_full_);
// 解锁
pthread_mutex_unlock(&mtx_);
}
private:
std::queue<T>bq_;
pthread_mutex_t mtx_;
pthread_cond_t not_full_;
pthread_cond_t not_empty_;
size_type capacity_;
//bool done = false;
};


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 3回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示