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

做水果的网站家具网站建设需求

做水果的网站,家具网站建设需求,成都行业网站设计,vip网站解析建设muduo异步日志实现 陈硕老师的muduo网络库的异步日志的实现#xff0c;今晚有点晚了#xff0c;我明晚再把这个异步日志抽出来#xff0c;作为一个独立的日志库。 所在文件 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::vectorchar buffer_;size_t readerIndex_;size_t writerIndex_;static const char kCRLF[];*/typedef muduo::detail::FixedBuffermuduo::detail::kLargeBuffer Buffer;typedef std::vectorstd::unique_ptrBuffer BufferVector;typedef BufferVector::value_type BufferPtr; // 表示容器元素的类型const int flushInterval_; // 刷盘的时间间隔std::atomicbool 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.husing 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_castint(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.pierceye.com/news/245894/

相关文章:

  • 陕西建设 节水 官方网站论坛怎样发帖推广
  • 二合一收款码免费制作网站营销型网站代理
  • 网站建设的技术方案模板淘宝客做网站链接
  • 梅州市网站制作页面简洁的导航网站
  • 绵阳房产网站建设自学广告设计该怎么入手
  • 火星wap建站宏大建设集团有限公司网站
  • 免费搭建业网站西地那非片有延时效果吗
  • 网站制作 手机用c 做的网站怎么打开
  • 常见的企业网站有哪些佛山网站建设优化制作公司
  • 品牌网站建设 蝌蚪5小wordpress 链接修改
  • 江苏省建设通官方网站网站开发全程实例
  • 网络推广和网站推广wordpress主题如何用
  • 多语言网站 自助网站建设的功能有哪些方面
  • mysql 收费 网站建设四川省建筑公司
  • 装修网站横幅怎么做优化方案英语
  • 网站建设数据库实验心得怎么做移动端网站
  • 网站建设开发服务费记账计算机应用技术培训班
  • 广渠路网站建设优易建站终身用沧州响应式网站开发
  • 网站流量统计查询南宁百度seo建议
  • 东莞做网站制作建筑公司图片
  • 浏阳市网站建设登录注册网站怎么做
  • 聊城手机网站建设电话网站开发需要哪些
  • 学做网站要学什么东西wordpress 分页地址
  • 淘宝客网站建设要注意什么windows系统没有wordpress
  • 产看网站权重运维难还是开发难
  • 芜湖中凡网站建设公司中国建设工程招投网站
  • 手机网站开发+图库类13岁开网络科技公司
  • 网站上的产品板块广州展厅设计公司有哪些
  • 网站建设源代码交付网站系统制作教程视频教程
  • 做网站刷赞qq怎么赚钱网站特效js代码