我正在制作记录器。我想创建一个以流作为输入的函数log()
。
例如:
log("hello"<<" "<<"world"<<10<<"\n");
我也希望它是线程安全的。
我已经重新定义了<<
运算符,所以我可以这样做:
log()<<"hello"<<"world"<<10<<"\n"
但是这个操作不是线程安全的。
如何使其线程安全?
答案 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_lock
和release_lock
来电。当然也可以使用适合您的流。
答案 2 :(得分:0)
在C ++ 03中,所有操作都不是线程安全的