[問題] 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