zoukankan      html  css  js  c++  java
  • c++11日志练习

    /**************************************************************
    技术博客 

    技术交流群
    群号码: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;
    }
    

      

  • 相关阅读:
    拦截器和过滤器区别
    sql语句查询出数据重复,取唯一数据
    bootstrap ace treeview树表
    bootstrap 时间选择器 datetime
    ajax请求后加额外的数据
    使用ajax请求,模态框调用并更改密码
    ajax get和post请求 后端接收并返回数据
    类的访问级别
    继承与组合
    类型转换函数
  • 原文地址:https://www.cnblogs.com/itdef/p/4658351.html
Copyright © 2011-2022 走看看