多个记录器写入一个文件C ++

时间:2014-06-25 03:36:26

标签: c++ logging

我正在尝试实现一个日志记录场景,其中有多个记录器用于项目中的不同组件。所有这些记录器都尝试写入文件。是否有任何库可以用这种方式或某种方式来同步C ++中的活动(如在Java中)。

还共享一个句柄。

4 个答案:

答案 0 :(得分:2)

C ++ 11中的

#include <mutex>会做到这一点。您需要做的就是将文件号传递给每个part \ program \ thread

请注意竞争条件。

答案 1 :(得分:0)

您可以在日志记录代码中添加互斥锁。这将保护它免于并发,因为只有一个线程可以一次锁定互斥锁,其他线程等待锁定调用。

在UNIX下,您可以使用p_threads互斥锁和Win32下的关键部分。

CRITICAL_SECTION my_mutex;

void initialise()
{
    InitializeCriticalSection(&my_mutex);
}

void log(const char *some text)
{
    EnterCriticalSection(&my_mutex);

    // do some logging

    LeaveCriticalSection(&my_mutex);
}

在UNIX下大致相同,除了使用:

pthread_mutex_t my_mutex;
pthread_mutex_init(&my_mutex, NULL);   /// instead of InitializeCriticalSection()
pthread_mutex_lock(&my_mutex);         /// instead of EnterCriticalSection()
pthread_mutex_unlock(&my_mutex);       /// instead of LeaveCriticalSection()

答案 2 :(得分:0)

实现线程安全队列,应用程序的所有组件都会将日志消息推送到您的队列。从此队列弹出消息并写入您的日志文件。

答案 3 :(得分:0)

互斥是一种便携且有保证的方法。

虽然 保证可以正常工作,但在常见的实现中,任何单个ofstream << x操作的输出都不会与其他线程混合在一起。同一个流上的操作(即fstream可能在内部使用互斥或​​精心构造的无锁入队),所以如果你避免这样做......

my_ofstream << x << y << '\n';  // troublesome: 3 fstream operations

...赞成这个......

std::ostringstream oss;
oss << x << y << '\n';
my_ofstream << oss.rdbuf();   // usually ok: 1 fstream operation

...您可以将输出线保持在一起。对于日志记录,这通常很容易在日志记录宏中集中编排。对于分布式文件I / O,它是一个令人讨厌的问题。在本地ostringstream中准备数据然后复制它显然是更多的工作,但至少这样的工作可以由许多线程同时执行,然后复制到单个ofstream对象非常快。对于使用某些内部同步的实现,将您自己的外部同步包装在您的入口周围会不必要地降低速度。