多线程环境中的输出字符串流出现问题

Issue with output stringstream in multi-threaded environment

本文关键字:问题 字符串 输出 环境 多线程      更新时间:2023-10-16

我正在实现一个需要在多线程环境中工作的记录器。

这是我作为一个单例类实现的

class myLog {
// Implementation
};

为了提供一个干净简单的界面,我提供了一些宏的

#define MY_LOG_DEBUG MY_LOG(LOG_MSG, DEBUG)
static ostringstream log_msg;
#define MY_LOG(LOG_MSG, DEBUG) {
get_lock();
log_msg << LOG_MSG; 
myLog::getInstance().dump(log_msg, DEBUG);
log_msg.str("");
get_unlock();
}

问题是,这很好用,但在多线程环境中,我经常会遇到日志转储不完整、混乱或遗漏一些字符的情况。

我怀疑这可能是因为:

  1. 未刷新的输出流尝试setbuf(stdout,NULL)
  2. 每次写入输出流后,未清除输出字符串流容器

在多线程场景中,有什么方法可以消除以上两个疑虑?

附言:使用相当古老的gcc 4.4.5:(

当我使用每线程缓冲区时,问题得到了解决。

static __thread char buffer[BUFF_LEN];

然而,我仍然不确定在多线程环境下字符串流的行为。