/**************************************************************
技术博客 
技术交流群
群号码:324164944

欢迎c c++ windows驱动爱好者 服务器程序员沟通交流

**************************************************************/

使用c++11 写个日志类

主要练习 线程 互斥量的使用

代码如下:

#include "stdafx.h"
#include "Logger.h"
#include <fstream>
#include <iostream> Logger::Logger(const string& filepath):
filePath_(filepath)
{ } Logger::~Logger()
{ thread_.join();
} bool Logger::init()
{
bool bRet = false;
thread_ = thread{ &Logger::LogThreadFunc, this };
unique_lock<mutex> lock(mutexStarted_);
condVarStarted_.wait(lock); bRet = true;
return bRet;
} void Logger::Log(const std::string& content)
{
unique_lock<mutex> lock(mutex_);
queue_.push(content); } void Logger::LogThreadFunc()
{
ofstream ofs(filePath_);
if (ofs.fail()) {
cerr << "Failed to open logfile." << endl;
return;
} cout << "enter thread" << endl;
unique_lock<mutex> lock(mutex_,std::defer_lock);
condVarStarted_.notify_all(); while (true){
lock.lock();
condVar_.wait(lock);
lock.unlock(); while (true){
lock.lock();
if (queue_.empty()) {
lock.unlock();
break;
}
else {
ofs << queue_.front() << endl;
queue_.pop();
}
lock.unlock();
}
if (bExit_){
break;
}
} }

  

#ifndef LOGGER_H__
#define LOGGER_H__ #include <queue>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable> #define DEFAULT_FILE_NAME "test.dat" using namespace std; class Logger{
public:
Logger(const string& filepath = DEFAULT_FILE_NAME);
virtual ~Logger();
bool init(); void Log(const std::string& content);
void LogThreadFunc();
void SetExitFlag(){
bExit_ = true;
condVar_.notify_all();
};
private:
string filePath_;
bool bExit_;
std::condition_variable condVar_;
std::condition_variable condVarStarted_;
std::thread thread_;
std::mutex mutex_;
std::mutex mutexStarted_;
std::queue<std::string> queue_;
Logger& operator=(const Logger& rhs);
}; #endif

  测试代码如下:

// 1111.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "Logger.h"
#include <iostream>
#include <sstream>
#include <thread>
#include <vector> void logSomeMessages(int id, Logger& logger)
{
for (int i = 0; i < 100; ++i) {
stringstream ss;
ss << "Log test " << i << " from thread " << id;
logger.Log(ss.str());
}
} int _tmain(int argc, _TCHAR* argv[])
{
Logger log;
log.init(); vector<thread> threads;
// Create a few threads all working with the same Logger instance.
for (int i = 0; i < 100; ++i) {
threads.push_back(thread{ logSomeMessages, i, ref(log) });
} for (auto& t : threads) {
t.join();
} log.SetExitFlag();
return 0;
}

  

c++11日志练习的更多相关文章

  1. [译]Stairway to Integration Services Level 11 - 日志配置

    介绍 在前一个章节我们讨论了事先行为,分享了如何操作默认的行为和时间冒泡,并且介绍了父子模型. 本文中,我们会配置SSIS日志. 进行简单及高级日志配置,存储,和检索的实验.并且生成自定义日志信息. ...

  2. Go语言学习之11 日志收集系统kafka库实战

    本节主要内容: 1. 日志收集系统设计2. 日志客户端开发 1. 项目背景    a. 每个系统都有日志,当系统出现问题时,需要通过日志解决问题    b. 当系统机器比较少时,登陆到服务器上查看即可 ...

  3. ogre3D学习基础11 -- 日志文件的使用与异常处理

    用文件来记录 Ogre 系统初始化.运行.结束以及调试信息.使用日志便于我们调试程序.Ogre 日志系统由两个类组成:Log 类与 LogManager. 1.Log类 Log 类的一个对象对应于一个 ...

  4. ELK+Filebeat+Kafka+ZooKeeper 构建海量日志分析平台(elk5.2+filebeat2.11)

    ELK+Filebeat+Kafka+ZooKeeper 构建海量日志分析平台 参考:http://www.tuicool.com/articles/R77fieA 我在做ELK日志平台开始之初选择为 ...

  5. atitit. 日志系统的原则and设计and最佳实践(1)-----原理理论总结.

    atitit. 日志系统的原则and设计and最佳实践总结. 1. 日志系统是一种不可或缺的单元测试,跟踪调试工具 1 2. 日志系统框架通常应当包括如下基本特性 1 1. 所输出的日志拥有自己的分类 ...

  6. Centos6.5使用ELK(Elasticsearch + Logstash + Kibana) 搭建日志集中分析平台实践

    Centos6.5安装Logstash ELK stack 日志管理系统 概述:   日志主要包括系统日志.应用程序日志和安全日志.系统运维和开发人员可以通过日志了解服务器软硬件信息.检查配置过程中的 ...

  7. Oracle 联机重做日志文件(ONLINE LOG FILE)

    --========================================= -- Oracle 联机重做日志文件(ONLINE LOG FILE) --================== ...

  8. Spring aop+自定义注解统一记录用户行为日志

    写在前面 本文不涉及过多的Spring aop基本概念以及基本用法介绍,以实际场景使用为主. 场景 我们通常有这样一个需求:打印后台接口请求的具体参数,打印接口请求的最终响应结果,以及记录哪个用户在什 ...

  9. Natasha V1.3.6.0 的升级日志

    开源库满足于个人,而完善于大众. Natasha 自稳定版发布之后,众多老铁参与增强改进,感谢如下老铁的反馈: 1. 异常搜集 在 wenjq0911 建议下,添加了异常捕获,现 Natasha 的编 ...

随机推荐

  1. PyQt5系列教程

    PyQt5系列教程(一)Mac OS X下搭建Python3.5.1+PyQt5开发环境PyQt5系列教程(二)利用QtDesigner设计UI界面PyQt5系列教程(三)用py2exe进行程序打包P ...

  2. 好久没玩laravel了,5.6玩下(二)

    做个项目的增删改查 第一步  把数据库的表结构建好,生成迁移 1 怎么建,当然是用php artisan命令了 使用 Artisan 命令 make:migration 来创建一个新的迁移: php ...

  3. Appium——unknown error: cannot activate web view

    测试步骤: 1. 打开必应APP(如果出现欢迎界面和定位服务弹窗,需要点掉) 2. 点击搜索按钮 3. 输入JAVA到搜索框 4. 点击搜索网页 5. 观察显示搜索出来的结果是否含有java 6.   ...

  4. leetcode108

    /** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...

  5. Linux tomcat启动慢, Creation of SecureRandom instance for session ID generation using [SHA1PRNG]took [xx] mil

    启动慢的解决链接:  http://blog.csdn.net/u011627980/article/details/54024974

  6. as3 根据鼠标移动方向

    gz 为一个影片 import flash.display.Sprite; stage.addEventListener(MouseEvent.MOUSE_MOVE, onStageMouseMove ...

  7. ASP.NET MVC+JQueryEasyUI1.4+ADO.NET Demo

    1.JQueryEasyUI使用 JQuery EasyUI中文官网:http://www.jeasyui.net/ JQuery EasyUI中文官网下载地址:http://www.jeasyui. ...

  8. python之commands模块

    要获得shell命令的输出只需要`cmd`命令就可以了, 需要得到命令执行的状态则需要判断$?的值, 在Python中有一个模块commands也很容易做到以上的效果.看一下三个函数:1). comm ...

  9. js函数中变量声明提前

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. docker上传镜像

    已经存在镜像 docker tag conductor:ui docker.io/mhcvs2/mhc docker push docker.io/mhcvs2/mhc