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

自己做免费手机网站百度竞价客服

自己做免费手机网站,百度竞价客服,ppt模板百度云,是做网站编辑还是做平面设计muduo异步日志实现 陈硕老师的muduo网络库的异步日志的实现,今晚有点晚了,我明晚再把这个异步日志抽出来,作为一个独立的日志库。 所在文件 AsyncLogging.cc AsyncLogging.h LogFile.h LogFile.cc CountDownLatch.h CountDownLatch.cc…

muduo异步日志实现

陈硕老师的muduo网络库的异步日志的实现,今晚有点晚了,我明晚再把这个异步日志抽出来,作为一个独立的日志库。

所在文件

  • AsyncLogging.cc

  • AsyncLogging.h

  • LogFile.h

  • LogFile.cc

  • CountDownLatch.h

  • CountDownLatch.cc

    这个CountDownLatch有点像信号量,但是又只有down操作,上网查了以下类似的,作用有点像屏障

class AsyncLogging : noncopyable
{public:AsyncLogging(const string& basename,off_t rollSize,int flushInterval = 3);~AsyncLogging(){if (running_){stop();}}void append(const char* logline, int len);void start(){running_ = true;thread_.start();	// 启动线程latch_.wait();		// 这里的wait调用其实并不会阻塞// 主线程}void stop() NO_THREAD_SAFETY_ANALYSIS{running_ = false;cond_.notify();thread_.join();}private:// 默认的守护进程执行的函数void threadFunc();/*Buffer的数据结构private:std::vector<char> buffer_;size_t readerIndex_;size_t writerIndex_;static const char kCRLF[];*/typedef muduo::detail::FixedBuffer<muduo::detail::kLargeBuffer> Buffer;typedef std::vector<std::unique_ptr<Buffer>> BufferVector;typedef BufferVector::value_type BufferPtr;	// 表示容器元素的类型const int flushInterval_;						// 刷盘的时间间隔std::atomic<bool> running_;					// 是否运行const string basename_;						// 文件名const off_t rollSize_;						// 日志回滚的大小muduo::Thread thread_;						// 日志类自带一个守护线程来写muduo::CountDownLatch latch_;					muduo::MutexLock mutex_;muduo::Condition cond_ GUARDED_BY(mutex_);BufferPtr currentBuffer_ GUARDED_BY(mutex_);	// 当前缓冲BufferPtr nextBuffer_ GUARDED_BY(mutex_);		// 预备缓冲BufferVector buffers_ GUARDED_BY(mutex_);		// 已经写满并等待落盘的缓冲
};
#include <stdio.h>using namespace muduo;AsyncLogging::AsyncLogging(const string& basename,off_t rollSize,int flushInterval): flushInterval_(flushInterval),running_(false),basename_(basename),rollSize_(rollSize),thread_(std::bind(&AsyncLogging::threadFunc, this), "Logging"),latch_(1),mutex_(),cond_(mutex_),currentBuffer_(new Buffer),nextBuffer_(new Buffer),buffers_()
{currentBuffer_->bzero();nextBuffer_->bzero();buffers_.reserve(16);
}void AsyncLogging::append(const char* logline, int len)
{muduo::MutexLockGuard lock(mutex_);if (currentBuffer_->avail() > len){currentBuffer_->append(logline, len);}else{buffers_.push_back(std::move(currentBuffer_));if (nextBuffer_){currentBuffer_ = std::move(nextBuffer_);}else{// 四个缓冲区都写满了currentBuffer_.reset(new Buffer); // Rarely happens}currentBuffer_->append(logline, len);// 这里的notify不一定什么时候都有效// 如果此时守护线程正在工作// 那么这个信后就会丢失,但是没有造成影响// 但是有可能守护线程正在条件变量上睡眠cond_.notify();}
}void AsyncLogging::threadFunc()
{assert(running_ == true);latch_.countDown();		// 计数器减一,latch_ == 0,并唤醒主线程LogFile output(basename_, rollSize_, false);	// 初始化一个输出流BufferPtr newBuffer1(new Buffer);BufferPtr newBuffer2(new Buffer);newBuffer1->bzero();newBuffer2->bzero();BufferVector buffersToWrite;	// 相当于一个前后端交互的单元// 将写满的buffer装到vector中// 在传输到后端buffersToWrite.reserve(16);while (running_){assert(newBuffer1 && newBuffer1->length() == 0);assert(newBuffer2 && newBuffer2->length() == 0);assert(buffersToWrite.empty());{muduo::MutexLockGuard lock(mutex_);// 使用条件变量完成定时任务if (buffers_.empty())  // unusual usage!{cond_.waitForSeconds(flushInterval_);}buffers_.push_back(std::move(currentBuffer_));currentBuffer_ = std::move(newBuffer1);buffersToWrite.swap(buffers_);	// buffers_变成一个空的buffers_if (!nextBuffer_){nextBuffer_ = std::move(newBuffer2);}}assert(!buffersToWrite.empty());// 如果日志太多了if (buffersToWrite.size() > 25){char buf[256];snprintf(buf, sizeof buf, "Dropped log messages at %s, %zd larger buffers\n",Timestamp::now().toFormattedString().c_str(),buffersToWrite.size()-2);fputs(buf, stderr);// 先输出一个报警的日志output.append(buf, static_cast<int>(strlen(buf)));// 清除多余的日志buffersToWrite.erase(buffersToWrite.begin()+2, buffersToWrite.end());}for (const auto& buffer : buffersToWrite){// FIXME: use unbuffered stdio FILE ? or use ::writev ?output.append(buffer->data(), buffer->length());}if (buffersToWrite.size() > 2){// drop non-bzero-ed buffers, avoid trashing// vector底层是智能指针不用担心内存泄露buffersToWrite.resize(2);}if (!newBuffer1){assert(!buffersToWrite.empty());newBuffer1 = std::move(buffersToWrite.back());buffersToWrite.pop_back();newBuffer1->reset();}if (!newBuffer2){assert(!buffersToWrite.empty());newBuffer2 = std::move(buffersToWrite.back());buffersToWrite.pop_back();newBuffer2->reset();}buffersToWrite.clear();output.flush();}output.flush();
}
http://www.ho-use.cn/article/1015.html

相关文章:

  • 赣州做网站哪家好东莞百度搜索优化
  • 服务器做网站好怎么给自己的公司建立网站
  • 茶叶网站建设规划书搜索引擎的四个组成部分及作用
  • 织梦音乐网站宜昌网站seo
  • 小说网站自动采集深圳广告策划公司
  • 如何把物流做免费网站网站推广优化公司
  • 做网站说什么5.0啥意思链接提交入口
  • 做免费外贸网站国产免费crm系统有哪些在线
  • 地域购物网站谷歌浏览器 安卓下载2023版
  • 网站建设竞争性磋商文件推广关键词
  • 网站无法做301重定向yandex引擎
  • 网站页面设计报价模板如何做seo搜索引擎优化
  • 网站开发设计图psd附近的教育培训机构有哪些
  • 无锡公司网站建设买友情链接有用吗
  • 模块化网站建设系统线上推广活动有哪些
  • 南京网站推广优化公司怎么优化网站的
  • win7家用电脑做网站服务器点击seo软件
  • 北京网站设计公司地址网页设计个人网站
  • flash 网站头部腾讯营销平台
  • 怎么查看网站有没有做ssl网站统计数据分析
  • 做暧暖的免费网站自己怎么开网站
  • 什么网站做任务赚钱吗广州现在有什么病毒感染
  • 做网站智能工具世界足球排名前100
  • 微信小程序后台管理系统seo怎么做优化计划
  • 山东临沂网站设计公司武汉刚刚发生的新闻
  • 商洛网站建设哪家好品牌传播策略
  • 做ps找图的网站有哪些长沙本地推广平台
  • 网站手机模板源码下载营销模式100个经典案例
  • 网站开发官网免费职业技能培训网
  • 高邮市建设网站seo怎么优化步骤