C++20 实现线程安全的日志输出 - 使用 std::jthread 和互斥锁
C++20 提供了 std::jthread 类型,这是一个 RAII 线程类型,可以帮助我们实现线程安全的日志输出。
下面是一个简单的示例:
#include <iostream>
#include <fstream>
#include <thread>
#include <mutex>
#include <chrono>
std::mutex log_mutex;
std::ofstream log_file("log.txt");
void log(const std::string& message) {
std::lock_guard<std::mutex> lock(log_mutex);
log_file << message << std::endl;
}
void worker(int id) {
for (int i = 0; i < 10; ++i) {
// 生成日志信息
std::string message = "Thread " + std::to_string(id) + ": " + std::to_string(i);
// 输出日志信息
log(message);
// 等待一段时间
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
int main() {
// 创建多个线程
std::jthread threads[4];
for (int i = 0; i < 4; ++i) {
threads[i] = std::jthread(worker, i);
}
// 等待所有线程完成
for (int i = 0; i < 4; ++i) {
threads[i].join();
}
// 关闭日志文件
log_file.close();
return 0;
}
在上面的示例中,我们使用了一个互斥锁来保护日志文件的写操作,确保多个线程不会同时写入日志文件。
我们还使用了 std::jthread 类型来创建多个线程,并等待它们完成。每个线程都会生成一些日志信息,并调用 log 函数将其写入日志文件中。
当所有线程完成后,我们关闭日志文件。这样,我们就可以在其他地方读取并分析日志文件了。
需要注意的是,上面的示例只是一个简单的示例,实际上,实现一个高效可靠的日志系统还需要考虑许多其他因素,例如日志级别、日志轮换、日志格式等等。
原文地址: https://www.cveoy.top/t/topic/lEE0 著作权归作者所有。请勿转载和采集!