gpt4 book ai didi

c++ - 如何确保链式日志记录语句是原子的?

转载 作者:太空狗 更新时间:2023-10-29 23:34:14 24 4
gpt4 key购买 nike

我有一个日志类,它有 operator<<重载。所以我可以这样做:

oLogger << "Log this" << " and this" << " and " << 10 << endl;
oLogger`<< "Something else" << endl;

记录器可以毫无问题地执行此操作。但是,我希望在线程之间共享记录器对象。然后,我不希望它打印出这样的东西:

//LogFILE
Log this and this Something else
and 10

所以,我需要锁定 operator<< 的整个链秒。我猜这可以用 RAII 来完成,我还没有考虑太多。与此同时,是否有任何传统方法可以完成这项工作? (除了用操纵器结束输入?)

最佳答案

Nim 的回答略有不同:

创建

class LockedLog {
static MutEx mutex; // global mutex for logging
ScopedLock lock; // some scoped locker to hold the mutex
Logger &oLogger; // reference to the log writer itself
public:
LockedLog(Logger &oLogger) : oLogger(oLogger), lock(mutex) {}
template <typename T>
LockedLog &operator<<(const T &value) { oLogger << value; return *this; }
};

或者只是做:

LockedLog(oLogger) << "Log this" << " and this " << " and " << 10 << endl;

或更改Logger::operator<<普通方法,在LockedLog::operator<<中调用此方法,将 cast-operator 添加到 Logger :

operator LockedLog() { return LockedLog(*this); }

这应该会为您当前的代码添加锁定。

更新:锁定所有对 operator<< 的调用并且可能甚至锁定他们参数的评估(取决于编译器是先评估左参数还是右参数,它可以选择)。为了减少这种情况,可以:

class LockedLog {
static MutEx mutex; // global mutex for logging
std::stringstream buffer; // temporary formatting buffer;
Logger &oLogger; // reference to the log writer itself
public:
LockedLog(Logger &oLogger) : oLogger(oLogger), lock(mutex) {}
template <typename T>
LockedLog &operator<<(const T &value) { buffer << value; return *this; }
~LockedLog() { ScopedLock lock(mutex); oLogger << buffer.str() << std::flush; }
};

但是 stringstream增加了另一个开销。

关于c++ - 如何确保链式日志记录语句是原子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4955134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com