使用ostream进行C ++日志记录

时间:2012-02-15 16:22:35

标签: c++ stream

我正在制作记录器。我想创建一个以流作为输入的函数log()

例如:

log("hello"<<" "<<"world"<<10<<"\n");

我也希望它是线程安全的。

我已经重新定义了<<运算符,所以我可以这样做:

log()<<"hello"<<"world"<<10<<"\n"

但是这个操作不是线程安全的。

如何使其线程安全?

3 个答案:

答案 0 :(得分:9)

log()返回一个缓冲内存中所有输出的临时对象。此对象的析构函数将在表达式的末尾运行,并且应该在单个原子操作中将累积的数据刷新到实际流中(由您决定是否使该操作成为原子)。

这将使您的第二种语法可行:

log()<<"hello"<<"world"<<10<<"\n";

答案 1 :(得分:1)

您无法创建所需的功能。但是,您可以创建一个宏来处理这些内容:

// "log" may be defined in the <cmath> header file
// so undefine it if needed
#ifdef log
# undef log
#endif
#define log(stream)          \
    do {                     \
        acquire_lock();      \
        std::cout << stream; \
        release_lock();      \
    } while(0)

您必须为您调整acquire_lockrelease_lock来电。当然也可以使用适合您的流。

答案 2 :(得分:0)

在C ++ 03中,所有操作都不是线程安全的