中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

自己做免費(fèi)手機(jī)網(wǎng)站成都網(wǎng)站快速優(yōu)化排名

自己做免費(fèi)手機(jī)網(wǎng)站,成都網(wǎng)站快速優(yōu)化排名,為什么要建設(shè)檔案網(wǎng)站,免費(fèi)ftp空間muduo異步日志實現(xiàn) 陳碩老師的muduo網(wǎng)絡(luò)庫的異步日志的實現(xiàn),今晚有點(diǎn)晚了,我明晚再把這個異步日志抽出來,作為一個獨(dú)立的日志庫。 所在文件 AsyncLogging.cc AsyncLogging.h LogFile.h LogFile.cc CountDownLatch.h CountDownLatch.cc…

muduo異步日志實現(xiàn)

陳碩老師的muduo網(wǎng)絡(luò)庫的異步日志的實現(xiàn),今晚有點(diǎn)晚了,我明晚再把這個異步日志抽出來,作為一個獨(dú)立的日志庫。

所在文件

  • AsyncLogging.cc

  • AsyncLogging.h

  • LogFile.h

  • LogFile.cc

  • CountDownLatch.h

  • CountDownLatch.cc

    這個CountDownLatch有點(diǎn)像信號量,但是又只有down操作,上網(wǎng)查了以下類似的,作用有點(diǎn)像屏障

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調(diào)用其實并不會阻塞// 主線程}void stop() NO_THREAD_SAFETY_ANALYSIS{running_ = false;cond_.notify();thread_.join();}private:// 默認(rèn)的守護(hù)進(jìn)程執(zhí)行的函數(shù)void threadFunc();/*Buffer的數(shù)據(jù)結(jié)構(gòu)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_;					// 是否運(yùn)行const string basename_;						// 文件名const off_t rollSize_;						// 日志回滾的大小muduo::Thread thread_;						// 日志類自帶一個守護(hù)線程來寫muduo::CountDownLatch latch_;					muduo::MutexLock mutex_;muduo::Condition cond_ GUARDED_BY(mutex_);BufferPtr currentBuffer_ GUARDED_BY(mutex_);	// 當(dāng)前緩沖BufferPtr nextBuffer_ GUARDED_BY(mutex_);		// 預(yù)備緩沖BufferVector buffers_ GUARDED_BY(mutex_);		// 已經(jīng)寫滿并等待落盤的緩沖
};
#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{// 四個緩沖區(qū)都寫滿了currentBuffer_.reset(new Buffer); // Rarely happens}currentBuffer_->append(logline, len);// 這里的notify不一定什么時候都有效// 如果此時守護(hù)線程正在工作// 那么這個信后就會丟失,但是沒有造成影響// 但是有可能守護(hù)線程正在條件變量上睡眠cond_.notify();}
}void AsyncLogging::threadFunc()
{assert(running_ == true);latch_.countDown();		// 計數(shù)器減一,latch_ == 0,并喚醒主線程LogFile output(basename_, rollSize_, false);	// 初始化一個輸出流BufferPtr newBuffer1(new Buffer);BufferPtr newBuffer2(new Buffer);newBuffer1->bzero();newBuffer2->bzero();BufferVector buffersToWrite;	// 相當(dāng)于一個前后端交互的單元// 將寫滿的buffer裝到vector中// 在傳輸?shù)胶蠖薭uffersToWrite.reserve(16);while (running_){assert(newBuffer1 && newBuffer1->length() == 0);assert(newBuffer2 && newBuffer2->length() == 0);assert(buffersToWrite.empty());{muduo::MutexLockGuard lock(mutex_);// 使用條件變量完成定時任務(wù)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底層是智能指針不用擔(dān)心內(nèi)存泄露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.risenshineclean.com/news/52931.html

相關(guān)文章:

  • 網(wǎng)站關(guān)聯(lián)詞搜索怎么做bt磁力搜索引擎在線
  • 做營銷型網(wǎng)站的教程打開百度搜索網(wǎng)站
  • 商務(wù)網(wǎng)站建設(shè)需要多少錢廈門seo關(guān)鍵詞優(yōu)化代運(yùn)營
  • 公司網(wǎng)站怎么推廣在線域名解析ip地址
  • 網(wǎng)站建設(shè)排名公司哪家好網(wǎng)絡(luò)廣告公司排名
  • 織夢html5網(wǎng)站模板百度推廣廣告公司
  • 上海網(wǎng)站建設(shè)公司費(fèi)用百度快速提交入口
  • 網(wǎng)站模板框架seo網(wǎng)站優(yōu)化培訓(xùn)要多少錢
  • 住房建設(shè)廳官方網(wǎng)站成人短期技能培訓(xùn)
  • 梁山專業(yè)網(wǎng)站建設(shè)網(wǎng)址檢測
  • 做網(wǎng)站開源框架簡述網(wǎng)絡(luò)推廣的方法
  • 網(wǎng)站域名更換是怎么做的網(wǎng)站是怎么做出來的
  • 可信網(wǎng)站值得做嗎seo推廣專員工作內(nèi)容
  • 河源今日新聞頭條火災(zāi)優(yōu)化設(shè)計四年級上冊語文答案
  • 重慶涪陵網(wǎng)站建設(shè)南寧百度推廣seo
  • 網(wǎng)站推廣方案的構(gòu)成整站優(yōu)化服務(wù)
  • 模板網(wǎng)站音響案例數(shù)字營銷包括哪六種方式
  • 網(wǎng)站內(nèi)容管理系統(tǒng)建站企業(yè)網(wǎng)站
  • 內(nèi)蒙古網(wǎng)站建設(shè)價格輿情網(wǎng)站入口
  • 做視頻網(wǎng)站需要多大帶寬微網(wǎng)站建站平臺
  • 網(wǎng)站建設(shè)維護(hù)協(xié)議書北海百度seo
  • 品牌網(wǎng)站建設(shè)精湛磐石網(wǎng)絡(luò)百度登錄賬號首頁
  • 合作建站方案關(guān)鍵詞優(yōu)化和seo
  • 優(yōu)化是企業(yè)通過網(wǎng)站來做嗎怎么制作小程序
  • 幫忙做網(wǎng)站花西子網(wǎng)絡(luò)營銷案例分析
  • 怎么找做網(wǎng)站的人視頻號最新動作
  • 怎么做代理人金沙網(wǎng)站seo的內(nèi)容有哪些
  • 想象力做網(wǎng)站百度官方推廣平臺
  • 房地產(chǎn) 網(wǎng)站模板南寧百度seo優(yōu)化
  • 網(wǎng)站備案入口營銷活動推廣策劃