如何在不同的线程上运行记录器

时间:2017-04-22 11:54:40

标签: c++ multithreading logging static

首先,这是一个好主意吗?由于IO操作与其他操作相比相当昂贵,我认为在单独的线程上运行logger应该是一个好主意。我设置它的方式是我有一个静态的,可变的模板化函数Logger :: log(args ...),每次调用都会在下一行打印一个时间戳,然后给出参数就像它们一样只是使用<<来推送到输出流。这是我想使用第二个线程来获取参数而不是将它们推送到它自己的输出的地方。

当我尝试这样做时,几乎没有出现问题。

如果为每次调用log而创建了一个线程,那么这意味着连续多次调用日志会在写入同一文件的那些线程之间产生竞争条件吗?

因此,如果有一个线程,则记录器只有静态成员和方法,因此该线程也应该是静态的?

在这种情况下,当使用一个静态线程时,我将运行一个无限循环函数来轮询日志请求队列,并且调用日志函数将意味着将新的日志请求推送到该队列。如何实施或有更好的解决方案?

以下是我的记录器的代码示例:

class Logger {
public:
    // This is the function you call to log something
    template <typename... T>
    static void log(T&&... args) {
        // I suppose somewhere here I should push the log request to queue
        using namespace date;
        _logStream << floor<std::chrono::seconds>(std::chrono::system_clock::now()) << " - ";
        _log(std::forward<T>(args)...);
    }

private:
    // Function that a thread get's when it is created
    static void run() {
        while (true) {
            // Handle que of log calls
        }
    }

    template <typename Th, typename... Tt>
    static void _log(Th&& head, Tt&& ... tail) {
        _logStream << head;
        _log(std::forward<Tt>(tail)...);
    }

    template <typename Th>
    static void _log(Th&& head) {
        _logStream << head << std::endl;
    }

    static std::thread _logThread;
    static std::ofstream _logStream;
};

修改:这篇文章(Is creating a separate thread for a logger ok?)并没有解决我的问题,只是澄清了我的一些问题。答案仍然是如何实现这个日志队列。

0 个答案:

没有答案