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

C++ 多个记录器写入一个文件C++;,c++,logging,C++,Logging,我试图实现一个日志场景,在这个场景中,一个项目中的不同组件有多个日志记录器。所有这些记录器都试图写入一个文件。在C++中(如在Java中)是否有任何库或某种方式来同步活动 也共享一个句柄。#C++11中的include可以做到这一点。您需要做的就是将文件号传递给每个part\program\thread 不过一定要注意竞争条件。您可以在日志代码中添加互斥锁。这将保护它不受并发性的影响,因为一次只有一个线程可以锁定互斥体,其他线程等待锁调用 在UNIX下,您可以在Win32下使用p_线程互斥和关键

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

也共享一个句柄。

#C++11中的include
可以做到这一点。您需要做的就是将文件号传递给每个part\program\thread


不过一定要注意竞争条件。

您可以在日志代码中添加互斥锁。这将保护它不受并发性的影响,因为一次只有一个线程可以锁定互斥体,其他线程等待锁调用

在UNIX下,您可以在Win32下使用p_线程互斥和关键部分

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()

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

互斥是一种可移植且有保证的方法


虽然不能保证工作,但在常见的实现中,来自该文件的并发队列的任何单个
流的输出将解决同步部分。您的意思是每个记录器都有自己的文件句柄;还是它们都共用一个手柄?这是多线程的吗?
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