码迷,mamicode.com
首页 > 编程语言 > 详细

c++11日志练习

时间:2015-07-19 11:34:19      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

使用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日志练习

标签:

原文地址:http://www.cnblogs.com/itdef/p/4658351.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!