[問題] Thread safe logger 實作

看板C_and_CPP (C/C++)作者 (檸檬子)時間11年前 (2014/06/24 17:27), 11年前編輯推噓9(9019)
留言28則, 7人參與, 最新討論串1/1
開發平台(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

06/24 19:34, , 1F
entercriticalsection?
06/24 19:34, 1F

06/24 21:55, , 2F
log者直接寫檔加mutex效率較差,可以考慮多一個thread負責寫檔
06/24 21:55, 2F

06/24 21:56, , 3F
要寫log的把訊息儲到thread safe queue, 寫檔的thread再從
06/24 21:56, 3F

06/24 21:56, , 4F
queue裡取出訊息來寫檔. thread safe queue可以是用mutex也可
06/24 21:56, 4F

06/24 21:57, , 5F
以是lock-free queue
06/24 21:57, 5F

06/24 22:20, , 6F
我是不同thread各自寫自己的紀錄 簡易做法
06/24 22:20, 6F

06/24 22:33, , 7F
What you need is Event-Driven lol (?)
06/24 22:33, 7F

06/24 22:34, , 8F
突然覺得libevent的應用範圍有點廣啊,雖然挺難用的
06/24 22:34, 8F

06/24 23:29, , 9F
請教lock free 含義是implement不用lock 等等sync物件
06/24 23:29, 9F

06/24 23:30, , 10F
還是說 使用上不需要額外自己lock 就叫lock free呢
06/24 23:30, 10F

06/24 23:31, , 11F
因為總覺得 lock free queue裡面實作一定會用到lock有辦法不
06/24 23:31, 11F

06/24 23:31, , 12F
用到嗎?
06/24 23:31, 12F

06/24 23:32, , 13F
這邊應該指透過 CPU 提供的 atomic 操作才算 lock free
06/24 23:32, 13F

06/24 23:33, , 14F
http://goo.gl/VUTMKG CAS 機制所延伸出的各種應用
06/24 23:33, 14F

06/25 01:09, , 15F
很像win32 interlocked那些api
06/25 01:09, 15F

06/25 01:09, , 16F
但跟queue那些結構怎扯上關係實在不明白~
06/25 01:09, 16F

06/25 01:10, , 17F
還是說提供atomic 就叫lock free呢
06/25 01:10, 17F

06/25 09:44, , 18F
1. 丟queue用polling方式來作log
06/25 09:44, 18F

06/25 09:44, , 19F
2. 可以用syslog來作這種雜事
06/25 09:44, 19F

06/25 09:47, , 20F
Win32 API 中的 Interlocked* 系列,就是要做 cmpxchg
06/25 09:47, 20F

06/25 09:48, , 21F
lockfree queue 藉由 CAS 機制來原子性的交換頭尾指標
06/25 09:48, 21F

06/25 09:49, , 22F
這是boost lockfree queue的實作 http://goo.gl/bUQvZ3
06/25 09:49, 22F

06/25 09:50, , 23F
看完程式碼就會非常清楚的知悉,atomic CAS 機制的應用
06/25 09:50, 23F

06/25 13:13, , 24F
C++11有atomic家族可以作類似的行為
06/25 13:13, 24F

06/25 13:13, , 25F

06/25 13:13, , 26F
atomic/interlocked都統稱lockless, 因為他們都是可以
06/25 13:13, 26F

06/25 13:14, , 27F
在「不須lock」的情況下正確運行。用C++11標準去作吧
06/25 13:14, 27F

06/25 22:43, , 28F
http://ppt.cc/gTkH 問一下這篇在現在CPU架構是安全的嗎?
06/25 22:43, 28F
文章代碼(AID): #1JgKI6aH (C_and_CPP)
文章代碼(AID): #1JgKI6aH (C_and_CPP)