[问题] Thread safe logger 实作

楼主: wowslr (平凡姜太公)   2014-06-24 17:27:31
开发平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++, Windows RTX
我想要实作一个简单的 thread safe logger 帮助我做一些纪录,
但因为 "thread safe" 这个问题有点头痛,
查了一些资料发现 fprintf 这个函式在 VC 似乎是没有保障 thread safe?
这点我不是很确定,如果他能保证两个执行绪对相同一个 FILE* 写出字串时,
字串不会发生交错,那这个问题感觉就好办?
( 开发环境不支援大部分的 C++ stdlib )
目前想到最简单的方法就是加 mutex,但考虑到在 realtime 环境下,
不是很想使用到互斥锁这种可能会影响效能的方式 (或是我这部分认知有错?)
想问一下有没有其他实践方式可以参考?
作者: QQ29 (我爱阿蓉)   2014-06-24 19:34:00
entercriticalsection?
作者: kwpn (ITSST)   2014-06-24 21:55:00
log者直接写档加mutex效率较差,可以考虑多一个thread负责写档要写log的把讯息储到thread safe queue, 写档的thread再从queue里取出讯息来写档. thread safe queue可以是用mutex也可以是lock-free queue
作者: hidog (.....)   2014-06-24 22:20:00
我是不同thread各自写自己的纪录 简易做法
作者: tjjh89017 (伊达政宗)   2014-06-24 22:33:00
What you need is Event-Driven lol (?)突然觉得libevent的应用范围有点广啊,虽然挺难用的
作者: QQ29 (我爱阿蓉)   2014-06-24 23:29:00
请教lock free 含义是implement不用lock 等等sync物件还是说 使用上不需要额外自己lock 就叫lock free呢因为总觉得 lock free queue里面实作一定会用到lock有办法不用到吗?
作者: LiloHuang (十年一刻)   2014-06-24 23:32:00
这边应该指透过 CPU 提供的 atomic 操作才算 lock free如 http://goo.gl/VUTMKG CAS 机制所延伸出的各种应用
作者: QQ29 (我爱阿蓉)   2014-06-25 01:09:00
很像win32 interlocked那些api但跟queue那些结构怎扯上关系实在不明白~还是说提供atomic 就叫lock free呢
作者: Killercat (杀人猫™)   2014-06-25 09:44:00
1. 丢queue用polling方式来作log2. 可以用syslog来作这种杂事
作者: LiloHuang (十年一刻)   2014-06-25 09:47:00
Win32 API 中的 Interlocked* 系列,就是要做 cmpxchglockfree queue 借由 CAS 机制来原子性的交换头尾指标这是boost lockfree queue的实作 http://goo.gl/bUQvZ3看完程式码就会非常清楚的知悉,atomic CAS 机制的应用
作者: Killercat (杀人猫™)   2014-06-25 13:13:00
C++11有atomic家族可以作类似的行为http://en.cppreference.com/w/cpp/atomicatomic/interlocked都统称lockless, 因为他们都是可以在“不须lock”的情况下正确运行。用C++11标准去作吧
楼主: wowslr (平凡姜太公)   2014-06-25 22:43:00
http://ppt.cc/gTkH 问一下这篇在现在CPU架构是安全的吗?

Links booklink

Contact Us: admin [ a t ] ucptt.com