阅读量:0
在C++中实现异步日志记录通常使用多线程来实现。以下是一个简单的示例代码:
#include <iostream> #include <fstream> #include <string> #include <thread> #include <queue> #include <mutex> #include <condition_variable> class Logger { public: Logger() : isRunning(true) { outputFile.open("log.txt", std::ios::app); workerThread = std::thread(&Logger::logWorker, this); } ~Logger() { isRunning = false; workerThread.join(); outputFile.close(); } void log(const std::string& message) { std::lock_guard<std::mutex> lock(mutex); logQueue.push(message); cv.notify_one(); } private: std::ofstream outputFile; std::queue<std::string> logQueue; std::mutex mutex; std::condition_variable cv; bool isRunning; std::thread workerThread; void logWorker() { while (isRunning) { std::unique_lock<std::mutex> lock(mutex); cv.wait(lock, [this] { return !logQueue.empty() || !isRunning; }); while (!logQueue.empty()) { std::string message = logQueue.front(); logQueue.pop(); outputFile << message << std::endl; } } } }; int main() { Logger logger; logger.log("Hello, World!"); logger.log("This is a log message."); return 0; }
在上面的示例中,Logger类包含一个日志队列logQueue
,一个互斥锁mutex
和一个条件变量cv
。日志消息通过log()
方法添加到队列中,在logWorker()
方法中的工作线程中从队列中取出消息,并将其写入日志文件中。当程序结束时,Logger类的析构函数会关闭日志文件并等待工作线程结束。
在主函数中,创建一个Logger实例,并使用log()
方法记录日志消息。由于日志记录是在后台线程中进行的,不会阻塞主线程。