我正在尝试实现一个日志记录场景,其中有多个记录器用于项目中的不同组件。所有这些记录器都尝试写入文件。是否有任何库可以用这种方式或某种方式来同步C ++中的活动(如在Java中)。
还共享一个句柄。
答案 0 :(得分:2)
#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
对象非常快。对于使用某些内部同步的实现,将您自己的外部同步包装在您的入口周围会不必要地降低速度。