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

网站开发湛江成都高新网站建设

网站开发湛江,成都高新网站建设,成都房地产交易中心官网,学平面设计的网站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.hkea.cn/news/14323628/

相关文章:

  • 网站优化排名软件网168电商平台
  • 厦门好景科技做网站更换wordpress界面
  • 网站与微信区别建设网站公司那家好
  • 宜昌当阳网站开发网站模板修改
  • win2008 iis建网站免费企业邮箱申请
  • 河南省建设厅八大员网站火车票网站建设多少钱
  • 南昌商城网站设计wordpress设计网页游戏
  • 重庆建站公司费用长沙招聘服务网
  • 永春县住房和城乡建设网站python建设购物网站
  • 做动漫网站想做网站制作运营注册什么公司核实
  • 福州网站建?O手机微网站注册登录源码
  • 苏州网站开发找薇如何做网站本地服务器吗
  • 特乐网站建设wordpress 文章 版权
  • 用vs2010做网站教程企业网站源码怎么获取
  • 免费网站建设咨询网站推广公司汉狮网络
  • 合肥门户网站制作建设大连网站建设意动科技
  • app公司网站建设如何建一个公司的网站
  • 网站经营内容grimhelm wordpress
  • 泉州网站建设制作网站百度地图
  • 东莞企业网站建设报价设计微信小程序
  • 软件工程课程网站开发设计模板素材网站
  • 商业网站推广骆驼网站建设
  • 门户网站建设工作聊城做网站推广
  • 漳州网站建设求职简历文山州建设局信息网站
  • hype做网站动效三门峡做网站
  • 网站的目录怎样做的大学生网站的设计风格
  • 网站服务器空间广州优秀网站设计
  • 建设网站浩森宇特开发流程管理
  • 上海网站建设兴策中视频自媒体注册
  • mip网站模板dw学生个人网页制作视频