zoukankan      html  css  js  c++  java
  • 毕设数据库内存优化-映射队列

    映射队列有4个API,分成两对。分别是:

    template<typename Fuck>
    BoundedMappingQueue
    {
      public:
        Fuck* Get();
    
        void Push();
    
        Fuck* Pop(int *pos);
    
        void Put(int pos);
    };
    

    其中Get和Push由用户调用,Pop和Put由线程池调用。

    // 用户
    Fuck *shit = queue.Get();
    // 对shit进行初始化或赋值
    // 初始化或赋值需要快
    // 因为此时队列处于加锁状态
    queue.Push();
    
    // 线程池
    int pos;
    Fuck *shit = queue.Pop(&pos);
    (*shit)();// 干活
    queue.Put(pos);
    

    具体介绍映射队列的每个API。

    template<typename Fuck>
    Fuck* Get()
    {
        mutex_.Lock();
        // 等待空闲的元素
        while (avail_[front_] < 0)
            empty_.Wait(mutex_);
        return queue_[avail_[front_]];
        // 不解锁,因为我们对参数进行初始化
        // 后会立刻调用Push
    }
    
    template<typename Fuck>
    void Push()
    {
        // 将初始化完毕的参数位置传给工作槽
        work_[front_] = avail_[front_];
        // 从空闲槽将元素位置删除
        avail_[front_] = -1;
        if (++front_ == capacity_)
            front_ = 0;
    
        mutex_.Unlock();
        // 唤醒工作线程
        ready_.Signal();
    }
    



    template<typename Fuck>
    Fuck* Pop(int *pos)
    {
        mutex_.Lock();
        // 等待可以工作的元素
        while (work_[work_back_] < 0)
            ready_.Wait(mutex_);
        
        // 获取可以工作的元素位置并保存于pos
        // 我们需要保存pos因为在完成工作后
        // 需要将元素位置重新放入空闲槽
        *pos = work_[work_back_];
    
        Fuck *shit = queue_[*pos];
       
        // 从工作槽中将元素位置删除
        work_[work_back_] = -1;
        if (++work_back_ == capacity_)
            work_back_ = 0;
    
        mutex_.Unlock();
        return shit;
    }
    
    
    template<typename T>
    void Put(int pos)
    {
        mutex_.Lock();
        // 将空闲元素的位置放入空闲槽
        avail_[avail_back_] = pos;
        if (++avail_back_ == capacity_)
            avail_back_ = 0;
    
        mutex_.Unlock();
        // 唤醒入列线程
        empty_.Signal();
    }
  • 相关阅读:
    JS---元素属性的操作
    JS---异常
    JS---OOP
    T-SQL---分页语句
    mui---在关闭webview之前给出提示
    mui---通过plus.webview.create创建webview并打开新页面并传参到新页面
    mui---要打开的页面loaded不自动显示,等服务器返回数据后,再做处理逻辑
    winform/timer控件/权限设置/三级联动
    winform 进程、线程
    winform 之MDI容器
  • 原文地址:https://www.cnblogs.com/xiaohengheng/p/6864827.html
Copyright © 2011-2022 走看看