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 函数将其写入日志文件中。

当所有线程完成后,我们关闭日志文件。这样,我们就可以在其他地方读取并分析日志文件了。

需要注意的是,上面的示例只是一个简单的示例,实际上,实现一个高效可靠的日志系统还需要考虑许多其他因素,例如日志级别、日志轮换、日志格式等等。

C++20 实现线程安全的日志输出 - 使用 std::jthread 和互斥锁

原文地址: https://www.cveoy.top/t/topic/lEE0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录