【发布时间】:2014-08-28 17:08:36
【问题描述】:
我已经实现了一个自定义记录器,我将信息转储到相应的文件:
像这样:
Logger::log["log_file"] << "Hi" << "Hi again" << "\n";
operator << 的实现如下。请注意缓冲区达到限制时转储到流中的位置:
//This is the function signature of std::endl and some other manipulators
typedef CoutType& (*StandardEndLine)(CoutType&);
/// This method defines an operator<< to take in std::endl
BasicLogger& operator<<(StandardEndLine manip);
/// write the log items to buffer
template <typename T>
BasicLogger & operator<< (const T& val)
{
std::stringstream *out = BasicLogger::getOut();
*out << val;
if(out->tellp() > 512000/*500KB*/){
flushLog();
}
return *this;
}
我的问题在于有多个 <<s 的行:
Logger::log["log_file"] << "Hi" << "Hi again" << "\n";
在执行<< "Hi" 之后,缓冲区可能会变满并执行刷新到流。
这对我来说是不可取的。 如果一行还没有结束,我正在寻找一种解决方案来忽略该限制(500KB)。
示例场景: 当应用程序将由不同线程填充的缓冲区写入同一个文件时,这个问题会突出显示:第一个缓冲区的最后一行写了一半,当另一个线程的第二个缓冲区在我可以完成最后一行之前将另外 500kb 写入文件时第一个缓冲区。
感谢您的想法和解决方案。 谢谢
【问题讨论】:
-
当你从多个线程写入同一个流和文件时,你需要锁定/同步。
-
几乎与以下内容重复:stackoverflow.com/q/10110048/179910
-
因此,如果在缓冲区中添加“Hi”会导致缓冲区已满,因此需要刷新,但您希望在行结束之前阻止这种情况,您建议在哪里存储额外的“ Hi again" 和 "\n" 字节,直到您决定刷新缓冲区是可以接受的?缓冲区已满,因此无法容纳更多数据...我想您可以重新设计缓冲区处理程序以在这种情况下调整缓冲区大小,但这不必要地复杂...
-
@AndrewMedico 拥有多个缓冲区的整个想法是尽可能避免锁定。事实上
BasicLogger::getOut()是一个map 的访问者,它的key 是thread_id :) -
@twalberg 完全,我的意思是 my 缓冲区的限制是 500KB 已经结束。这意味着,缓冲区已被数百行其他行填满,并且在写入最后一行时,已达到限制(500KB)。我不介意为了完成最后一行而忽略此限制。
标签: c++ operator-keyword