关于C++单例

q451157067 2013-10-22 08:26:45
最近看到一个项目的log库 用的Boost的单例

而outString函数居然没加锁,他不怕再多线程里出毛病?但你说这么大的项目,搞了好多年了,这种显而易见的问题应该不会发生啊

我看Boost的单例的源码,并没有处理这个问题的代码

我感觉会出现这种问题
thread1
singleton<Log>::get_instance().outString("hello");
thread1
singleton<Log>::get_instance().outString("world");

首先当thread1调用 get_instance()时候 加锁 返回Log引用 解锁 开始调用Log.outString("hello")

在这同一时刻,thread2正好也调用了get_instance(),然后也获得了log对象的引用,然后调用了
Log.outString("world");

难道他不怕thread1在printf("hello")还没输出完...正好被thread2的printf给 搅乱?
...全文
137 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
q451157067 2013-10-22
  • 打赏
  • 举报
回复
高手 呼叫高手
q451157067 2013-10-22
  • 打赏
  • 举报
回复
引用 4 楼 q451157067 的回复:
[quote=引用 3 楼 mougaidong 的回复:] outString 的源码在哪儿?
源码极端复杂 void Log::outDebug(LogFilterType filter, const char * str, ...) { va_list ap; va_start(ap, str); vlog(filter, LOG_LEVEL_DEBUG, str, ap); va_end(ap); }[/quote] void Log::vlog(LogFilterType filter, LogLevel level, char const* str, va_list argptr) { char text[MAX_QUERY_LEN]; vsnprintf(text, MAX_QUERY_LEN, str, argptr); // .......处理过程 忽略 就这里就有可能 出问题 }
q451157067 2013-10-22
  • 打赏
  • 举报
回复
引用 3 楼 mougaidong 的回复:
outString 的源码在哪儿?
源码极端复杂 void Log::outDebug(LogFilterType filter, const char * str, ...) { va_list ap; va_start(ap, str); vlog(filter, LOG_LEVEL_DEBUG, str, ap); va_end(ap); }
turing-complete 2013-10-22
  • 打赏
  • 举报
回复
outString 的源码在哪儿?
q451157067 2013-10-22
  • 打赏
  • 举报
回复
引用 1 楼 wangdahu888 的回复:
也许outString里加锁了呗
就是因为outString里面没加锁才有疑惑的....
  • 打赏
  • 举报
回复
也许outString里加锁了呗

64,692

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧