当前位置: 首页 > news >正文

中国建设银行官方网站2018年年报广州网站建设 信科公司

中国建设银行官方网站2018年年报,广州网站建设 信科公司,定制柜子品牌排行榜前十名,ps里怎么做网站### 循环队列和阻塞队列 #### 循环队列 - **定义**: 一个固定大小的数组,通过两个指针(front 和 back)管理队列的头部和尾部元素。 - **特点**: - **循环性**: 当指针到达数组的末尾时,可以回绕到数组的开头,从而利…

### 循环队列和阻塞队列

#### 循环队列
- **定义**: 一个固定大小的数组,通过两个指针(`front` 和 `back`)管理队列的头部和尾部元素。
- **特点**:
  - **循环性**: 当指针到达数组的末尾时,可以回绕到数组的开头,从而利用数组的全部空间。
  - **空间效率**: 使用固定大小的数组,避免了动态内存分配和释放带来的开销。

#### 阻塞队列
- **定义**: 一种线程安全的队列,在队列为空时尝试出队的线程会被阻塞,在队列已满时尝试入队的线程也会被阻塞。
- **特点**:
  - **线程安全**: 使用互斥锁和条件变量来保证多线程环境下的安全访问。
  - **阻塞机制**: 当队列为空或已满时,通过条件变量阻塞相应的线程,直到队列状态发生改变。

### 阻塞队列与生产者-消费者模型

#### 生产者-消费者模型
- **定义**: 一种经典的多线程同步模型,通常涉及两个角色:生产者和消费者。
  - **生产者**: 负责生产数据并将其放入队列。
  - **消费者**: 负责从队列中取出数据进行处理。
- **特点**:
  - **解耦**: 生产者和消费者通过共享队列进行数据交换,彼此之间解耦。
  - **同步**: 使用阻塞队列来实现生产者和消费者之间的同步。

### 阻塞队列与异步日志系统

#### 异步日志系统
- **定义**: 一种日志记录系统,其中日志记录操作与业务逻辑操作分离,通过异步机制提高性能。
- **特点**:
  - **非阻塞**: 业务逻辑线程将日志消息放入队列后立即返回,而不是等待日志写入完成。
  - **后台处理**: 专门的日志线程从队列中取出日志消息并写入日志文件。

#### 阻塞队列在异步日志系统中的应用
- **队列**: 用于存放日志消息。
- **生产者**: 业务逻辑线程,将日志消息放入队列。
- **消费者**: 日志处理线程,从队列中取出日志消息并写入日志文件。
- **同步**: 通过阻塞队列实现生产者和消费者的同步,确保日志消息不会丢失且处理有序。

### 代码分析

- **构造函数**: 初始化队列的最大大小和内部数组。
- **析构函数**: 销毁队列,释放内存。
- **清空队列**: 清空队列内容并重置指针。
- **检查队列状态**: 判断队列是否为空或已满。
- **获取队首和队尾元素**: 安全地获取队列的首尾元素。
- **入队和出队操作**: 提供线程安全的入队和出队操作,使用条件变量实现阻塞机制。

总的来说,这个阻塞队列通过互斥锁和条件变量,实现了多线程环境下的安全访问和同步机制,可以用于生产者-消费者模型中,实现高效的异步日志系统。

 
#ifndef BLOCK_QUEUE_H
#define BLOCK_QUEUE_H
 
#include<iostream>
#include<stdio.h>
#include<pthread.h>
#include<sys/time.h>
#include"../lock/locker.h"
 
using namespace std;
 
template<class T>
class block_queue{
public:
 
    /*初始化阻塞队列*/
    block_queue(int max_size) {
        if (max_size <= 0) {
            exit(-1);
        }
 
        m_max_size = max_size;
        T* m_array = new T[max_size];
        m_size = 0;
        m_front = -1;
        m_back = -1;
    }
 
    /*删除new出的T数组*/
    ~block_queue() {
        m_mutex.lock();
        if (m_array != NULL) {
            delete []m_array;
        }
        m_mutex.unlock();
    }
 
    /*清空队列*/
    void clear() {
        m_mutex.lock();
        m_size = 0;
        m_front = -1;
        m_back = -1;
        m_mutex.unlock();
    }
 
    /*判断队列是否已满*/
    bool full() {
        m_mutex.lock();
        if (m_size >= m_max_size) {
            m_mutex.unlock();
            return true;
        }
        m_mutex.unlock();
        return false;
    }
 
    /*判断队列是否为空*/
    bool empty() {
        m_mutex.lock();
        if (m_size == 0) {
            m_mutex.unlock();
            return true;
        }
        m_mutex.unlock();
        return false;
    }
 
    /*获得队首元素*/
    bool front(T &value) {
        m_mutex.lock();
        /*注意下面的if判断不能用empty,因为empty函数也有加锁操作,加两次锁会导致死锁*/
        if (size == 0) {
            m_mutex.unlock();
            return false;
        }
        //TODO:个人感觉这行逻辑出错,后面部分是原代码  value = m_array[m_front];
        value = m_array[(m_front + 1) % m_max_size];
        m_mutex.unlock();
        return true;
    }
 
    /*获得队尾元素*/
    bool back(T& value) {
        m_mutex.lock();
        if (size == 0) {
            m_mutex.unlock();
            return false;
        }
        value = m_array[m_back];
        m_mutex.unlock();
        return true;
    }
 
    int size() {
        int tmp = 0;
        m_mutex.lock();
        tmp = m_size;
        m_mutex.unlock();
        return tmp;
    }
 
    int max_size() {
        int tmp = 0;
        m_mutex.lock();
        tmp = m_max_size;
        m_mutex.unlock();
        return tmp;
    }
 
    /*往队列中添加元素前需要先将所有使用队列的线程先唤醒*/
    /*阻塞队列封装了生产者消费者模型,调用push的是生产者,也就是工作线程*/
    bool push(T& item) {
        m_mutex.lock();
        if (m_size >= m_max_size) {
            cond.broadcast();
            m_mutex.unlock();
            return false;
        }
 
        m_back = (m_back + 1) % m_max_size;
        m_array[m_back] = item;
        m_size++;
 
        cond.broadcast();
        m_mutex.unlock();
        return true;
    }
 
    /*调用pop的是消费者,负责把生产者的内容写入文件*/
    bool pop(T& item) {
        m_mutex.lock();
        while (m_size <= 0) {
            if (!cond.wait(m_mutex.get())) {
                m_mutex.unlock();
                return false;
            }
        }
 
        m_front = (m_front + 1) % m_max_size;
        item = m_array[m_front];
        m_size--;
        m_mutex.unlock();
        return true;
    }
 
    bool pop(T& item,int ms_timeout) {
        struct timespec t = {0,0};//tv_sec :从1970年1月1日 0点到现在的秒数 tv_nsec:tv_sec后面的纳秒数
        struct timeval now = {0,0};//tv_sec: 从1970年1月1日 0点到现在的秒数 tu_usec:tv_sec后面的微妙数
        gettimeofday(&now,nullptr);
        m_mutex.lock();
        if (m_size <= 0) {
            t.tv_sec = now.tv_sec + ms_timeout/1000;
            t.tv_nsec = (ms_timeout % 1000) * 1000;
            if (!m_cond.timewait(m_mutex.get(), t)) {
                m_mutex.unlock();
                return false;
            }
        }
        //TODO:这一块代码的意义不知道在哪里,留着DEBUG
        if (m_size <= 0) {
            m_mutex.unlock();
            return false;
        }
        m_front = (m_front + 1) % m_max_size;
        item = m_array[m_front];
        m_size--;
        m_mutex.unlock();
        return true;
    }
 
private:
    locker m_mutex;
    cond m_cond;
 
 
    T* m_array;
    int m_max_size;
    int m_size;
    int m_front;
    int m_back;
};
 
#endif

http://www.yayakq.cn/news/265800/

相关文章:

  • 网站的设计流程是怎么样的?建设工程消防监督管理规定网站
  • 南宁网站提升排名做企业网站通常哪找素材
  • 国家工程建设质量奖网站网站怎么做拉新
  • 企业购物平台网络优化工程师招聘信息
  • 免费APP 微信 网站平台网站建设 中企动力 常州
  • 怎样让自己的网站被收录建筑设计网课
  • 捷信做单网站wordpress付款
  • 制作网站模板青海西宁高端网站建设
  • 求个网站你明白的 知乎百度竞价镇江
  • 高端网站设计公司有网站策划推广方案
  • 服务器如何配置php网站办电视网络的是哪个公司?
  • .mom域名可以做网站吗长沙网站公司网站建设
  • 快速网站备案多少钱企业管理专业学什么
  • 一起做网站欧洲站下载微信
  • 网站开发技术学习ui设计生成器
  • 南山做网站公司有哪些wordpress 轮播广告
  • 学校网站建设意见做的好的响应式网站
  • 做易买网网站项目心得体会网页欣赏网站
  • 网站制作教程及流程崇信县门户网站
  • 网站怎么做房源天猫网站建设的目标是什么
  • 目前旅游网站开发网站开发 维护岗位职责
  • 网站是怎么盈利的30秒牢记5个域名
  • 做电影网站主机放哪比较好建设营销型网站公司
  • 做竞拍网站长沙企业建站方案
  • 差异基因做热图在线网站wordpress 商用
  • 网站开发毕业答辩演讲稿范文免费照片的网站模板免费下载
  • 深圳做二维码网站淘宝关键词搜索量查询工具
  • 娱乐类网站怎么建设wordpress添加下载地址
  • wordpress手机网站插件深圳龙岗小学排名
  • 国外优秀的平面设计网站win优化大师