首页 > 其他分享 >日志异步工作器的实现

日志异步工作器的实现

时间:2023-08-20 22:02:47浏览次数:34  
标签:std 异步 实现 void 工作 __ 日志 include

日志异步工作器的实现

/*实现异步工作器*/
#ifndef __M_LOOPER_H__
#define __M_LOOPER_H__
#include <mutex>
#include <thread>
#include <condition_variable> //条件变量
#include "buffer.hpp"
#include <functional>
#include <memory>

namespace nmzlog
{
    // 异步工作器
    class AsyncLooper
    {
        // 定义一个function类型
        using Functor = std::function<void(Buffer &)>; // 定义一个函数指针的类型
    public:
        // 构造函数
        AsyncLooper() {}
        using ptr = std::shared_ptr<AsyncLooper>; // 定义一个只能指针类型
        void stop();
        // 提供数据
        void push(const char *data, size_t len); // 不断新增,扩容的时候就不断添加到内存中,如果是固定大小就会阻塞
    private:
        // 回调函数
        Functor _callBack;//具体对缓冲区数据进行处理的回调函数,由异步工作器使用者来传入

    private:
        // 线程的入口函数
        void threadEntry();

    private:
        bool _stop;        // 工作器停止标志,是否停止异步工作器,是true,否false
        Buffer _pro_buf;   // 生产缓冲区
        Buffer _con_buf;   // 消费缓冲区
        std::mutex _mutex; // 互斥锁保证安全
        // 条件变量头文件condition_variable
        //  两个条件变量,会提供两个pcb的等待队列
        std::condition_variable _cond_pro; // 生产者的等待队列的条件变量
        std::condition_variable _cond_con; //
        std::thread _thread;               // 异步工作器对应的工作线程
    };
}
#endif

标签:std,异步,实现,void,工作,__,日志,include
From: https://blog.51cto.com/u_15562309/7164241

相关文章

  • 产品经理如何利用KPI指标实现最佳产品性能
     令人惊叹的产品KPI指标不仅意味着更多收入,而且还表明你了解你的产品。但作为产品经理,有时候会发现自己挣扎,要确定如何有效地利用KPI指标识别产品的表现。获得真正的洞察力,并将它们转换为可操作的见解,并不容易。本文将深入探讨产品经理如何有效地利用KPI指标,以便更真实度量产品......
  • 自动柯里化函数的实现
    JavaScript柯里化柯里化也是属于函数式编程里面一个非常重要的概念。我们先来看一下维基百科的解释:口在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化;口是把接收多个参数的函数,变成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数,而且返回结果的新......
  • 模拟实现简单的list
    这篇博客主要是关于使用模板实现list的模拟。什么是list:list是一种序列式容器,可以在常数时间内在任意位置进行插入和删除操作,并且支持前后双向迭代。list的底层是双向链表结构,每个元素存储在独立的节点中,节点通过指针指向前一个元素和后一个元素。list与forward_list非常相似,最主......
  • Geotools实现shape文件的写入
        众所周知Geotools作为开源的JavaGIS三方库,已经成为GIS服务器端的主流开源库,其功能非常强大,涉及到GIS业务的方方面面,其中就包括GIS数据的读写,今天小编就借助Geotools来实现shape数据的写入。   Geotools对于shape数据写入,主要提供了SimpleFeatureStore和Featur......
  • 深入研究高性能数据库连接池的实现原理与优化策略
    在现代的后端应用开发中,数据库连接池是提高性能和可伸缩性的关键组件之一。本文将深入探讨数据库连接池的实现原理,涵盖Java和Python示例,并介绍一些常见的连接池优化策略。数据库连接池的作用数据库连接池是一种维护和管理数据库连接的技术,它通过预先创建一组数据库连接,并将这些连接......
  • Python爬虫实现简单翻译
    importrequestsimportjsonimportosurl="http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"data={"from":"AUTO","to":"AUTO","smartresult":"dict&quo......
  • SOADB数据库收缩日志
    --在SQL2008中清除日志就必须在简单模式下进行,等清除动作完毕再调回到完全模式。USE[master]GOALTERDATABASESOADBSETRECOVERYSIMPLEWITHNO_WAITGOALTERDATABASESOADBSETRECOVERYSIMPLE--简单模式GOUSESOADBGO--SOADB_log为数据库日志文件逻辑名DBCCSHRI......
  • 使用PHP构建安全可靠的电子商务平台 - 实现无缝支付集成
    在构建一个安全可靠的电子商务平台时,实现无缝支付集成是至关重要的一步。通过使用PHP编程语言,您可以轻松地与各种支付网关进行集成,并确保用户的支付信息得到适当的加密和保护。下面是一些步骤和策略,可以帮助您使用PHP构建一个安全可靠的电子商务平台。1.选择适合的支付网关在......
  • 用正则实现复杂的查找和替换操作
    括号在正则中的功能就是用于分组。简单来理解就是,由多个元字符组成某个部分,应该被看成一个整体的时候,可以用括号括起来表示一个整体,这是括号的一个重要功能。其实用括号括起来还有另外一个作用,那就是“复用”。那分组和编号的规则是怎样的呢?其实很简单,用一句话来说就是,第几个括号就......
  • Three.js中实现碰撞检测
    1.引言碰撞检测是三维场景中常见的需求,Three.js是常用的前端三维JavaScript库,本文就如何在Three.js中进行碰撞检测进行记述主要使用到的方法有:射线法Raycaster包围盒boundingbox物理引擎Cannon.js2.RaycasterRaycaster用于进行raycasting(光线投射),光线投射用于进行鼠......