看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++, Windows RTX 我想要實作一個簡單的 thread safe logger 幫助我做一些紀錄, 但因為 "thread safe" 這個問題有點頭痛, 查了一些資料發現 fprintf 這個函式在 VC 似乎是沒有保障 thread safe? 這點我不是很確定,如果他能保證兩個執行緒對相同一個 FILE* 寫出字串時, 字串不會發生交錯,那這個問題感覺就好辦? ( 開發環境不支援大部分的 C++ stdlib ) 目前想到最簡單的方法就是加 mutex,但考慮到在 realtime 環境下, 不是很想使用到互斥鎖這種可能會影響效能的方式 (或是我這部分認知有錯?) 想問一下有沒有其他實踐方式可以參考? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.114.56.147 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1403602054.A.911.html ※ 編輯: wowslr (140.114.56.147), 06/24/2014 18:06:40 ※ 編輯: wowslr (140.114.56.147), 06/24/2014 18:08:39
QQ29:entercriticalsection? 06/24 19:34
kwpn:log者直接寫檔加mutex效率較差,可以考慮多一個thread負責寫檔 06/24 21:55
kwpn:要寫log的把訊息儲到thread safe queue, 寫檔的thread再從 06/24 21:56
kwpn:queue裡取出訊息來寫檔. thread safe queue可以是用mutex也可 06/24 21:56
kwpn:以是lock-free queue 06/24 21:57
hidog:我是不同thread各自寫自己的紀錄 簡易做法 06/24 22:20
tjjh89017:What you need is Event-Driven lol (?) 06/24 22:33
tjjh89017:突然覺得libevent的應用範圍有點廣啊,雖然挺難用的 06/24 22:34
QQ29:請教lock free 含義是implement不用lock 等等sync物件 06/24 23:29
QQ29:還是說 使用上不需要額外自己lock 就叫lock free呢 06/24 23:30
QQ29:因為總覺得 lock free queue裡面實作一定會用到lock有辦法不 06/24 23:31
QQ29:用到嗎? 06/24 23:31
LiloHuang:這邊應該指透過 CPU 提供的 atomic 操作才算 lock free 06/24 23:32
LiloHuang:如 http://goo.gl/VUTMKG CAS 機制所延伸出的各種應用 06/24 23:33
QQ29:很像win32 interlocked那些api 06/25 01:09
QQ29:但跟queue那些結構怎扯上關係實在不明白~ 06/25 01:09
QQ29:還是說提供atomic 就叫lock free呢 06/25 01:10
Killercat:1. 丟queue用polling方式來作log 06/25 09:44
Killercat:2. 可以用syslog來作這種雜事 06/25 09:44
LiloHuang:Win32 API 中的 Interlocked* 系列,就是要做 cmpxchg 06/25 09:47
LiloHuang:lockfree queue 藉由 CAS 機制來原子性的交換頭尾指標 06/25 09:48
LiloHuang:這是boost lockfree queue的實作 http://goo.gl/bUQvZ3 06/25 09:49
LiloHuang:看完程式碼就會非常清楚的知悉,atomic CAS 機制的應用 06/25 09:50
Killercat:C++11有atomic家族可以作類似的行為 06/25 13:13
Killercat:http://en.cppreference.com/w/cpp/atomic 06/25 13:13
Killercat:atomic/interlocked都統稱lockless, 因為他們都是可以 06/25 13:13
Killercat:在「不須lock」的情況下正確運行。用C++11標準去作吧 06/25 13:14
wowslr:http://ppt.cc/gTkH 問一下這篇在現在CPU架構是安全的嗎? 06/25 22:43