看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《kight (山中雜草一隻鹿)》之銘言: : 最近自己用MFC寫了一個FloodFill演算法要做影像處理.. : 但是由於圖檔太大處裡的時間會過久..所以打算利用四核的電腦 : 將圖片切割成4個執行緒去處理... : 但是當我切成4塊去處裡時卻反而比只有一個執行緒在跑時還慢.. : 我並沒有去Lock住任何的變數...但一直找不出問題的所在... : 在跑4個執行緒時.4個核心的使用量都不到一半..CPU的使用率也都只有25%左右.... : 可以請教是那裡出了問題嗎??? : 以下是我的FloodFill程式碼: : http://codepad.org/yBXdAHv4 : http://pastie.org/4243546 搞了好久...終於找出問題的所在... 所以就來自問自答..... 會造成使用多執行緒反而變慢的原因...在於使用了"queue"的原因.. 我在效能測試視窗中發現使用多執行緒時...queue一直呼叫Lockit.. 但是只有單一執行緒時並沒有去呼叫~~所以我很納悶. 我的queue是放在函式中做區域變數..照理說當多執行緒去執行同一函式時, 函式的變數應該彼此是不相干的,後來我複製相同的函式但是給不同的函式名稱 讓4個執行緒個別跑這些函式...結果效能測試視窗依然顯示queue去呼叫Lockit 之後我把queue改成使用陣列替代...多執行緒的效能就出來了.4顆核心都飆到100% 時間也縮短了快4倍.. 目前查到queue會鎖住執行緒的原因是: 為了使queue在多執行緒下是屬於Thread-Safe,每個執行緒在呼叫queue 的成員函式時都會鎖住queue...有錯請指正~~ 不知道除了使用陣列代替外...還有沒有更好的解決方法.... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.243.144.172 ※ 編輯: kight 來自: 111.243.144.172 (07/14 10:15)
damody:不要同步就好。 07/14 13:47
Arton0306:不知std::queue為什麼會lock 我只知道gcc -pthread後 07/14 16:57
Arton0306:new會變成thread safe 不知是不是類似原因 07/14 16:57
fuha:請問一下 你說queue 會 call Lockit 的函式名稱是什麼??? 07/14 17:04
在queue中..會呼叫的函式是_Lockit _Lock(_LOCK_DEBUG);
damody:所有標準容器都是 多執行緒安全的 會lock是正常的 07/14 17:31
damody:你可以用 const 函數 來讀取資料 應該有機會不 lock 07/14 17:31
shadow0326:standard says nothing of threads 07/14 21:40
loveme00835:damody 你什麼時候產生了幻覺? Q_Q 07/14 23:07
其實我自己也在想,為何我隨便亂寫的queue去做多執行緒測試時, 並沒有發生queue去lock執行緒的問題... 但是自己寫的FloodFill,queue就一直去呼叫Lockit 到底是什麼問題 ...目前不知道..XD ※ 編輯: kight 來自: 101.14.80.209 (07/15 00:24)
damody:恩,我還在檢查我的幻覺,不過真的印象很深刻的樣子 07/15 23:29
fuha:standard container thread safe ?? 07/15 23:51
kight:用Google查_Lockit _Lock(_LOCK_DEBUG),第一筆就有跟我一樣 07/15 23:54
kight:的問題..不過那解決方法我試了之後....沒用..XD 07/15 23:55
fuha:你是build debug版本的? 你build 也一樣嗎? 07/16 00:02
kight:嗯...一樣..是Debug板本.... 07/16 00:07
damody:debug 一定有thread-safe 的呀_Lockit _Lock(_LOCK_DEBUG); 07/16 01:55
damody:這裡有聲明,不過release的code沒看到 http://ppt.cc/B4vt 07/16 01:56
damody:我的意思是 請release??? 應該就沒問題了。 07/16 03:29
damody:對了,有thread-safe 是幻覺沒錯。 07/16 03:37
kight:嗯..我對Release版不是很熟,很怕跑出來的結果不對...XD 07/16 20:52
chengcti:因為 release 版少了很多保護. 包含timing問題會浮出 來 07/17 12:35