Re: [問題] 多執行緒反而變慢~

看板C_and_CPP (C/C++)作者 (山中雜草一隻鹿)時間13年前 (2012/07/14 02:41), 編輯推噓5(5015)
留言20則, 7人參與, 最新討論串2/2 (看更多)
※ 引述《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)

07/14 13:47, , 1F
不要同步就好。
07/14 13:47, 1F

07/14 16:57, , 2F
不知std::queue為什麼會lock 我只知道gcc -pthread後
07/14 16:57, 2F

07/14 16:57, , 3F
new會變成thread safe 不知是不是類似原因
07/14 16:57, 3F

07/14 17:04, , 4F
請問一下 你說queue 會 call Lockit 的函式名稱是什麼???
07/14 17:04, 4F
在queue中..會呼叫的函式是_Lockit _Lock(_LOCK_DEBUG);

07/14 17:31, , 5F
所有標準容器都是 多執行緒安全的 會lock是正常的
07/14 17:31, 5F

07/14 17:31, , 6F
你可以用 const 函數 來讀取資料 應該有機會不 lock
07/14 17:31, 6F

07/14 21:40, , 7F
standard says nothing of threads
07/14 21:40, 7F

07/14 23:07, , 8F
damody 你什麼時候產生了幻覺? Q_Q
07/14 23:07, 8F
其實我自己也在想,為何我隨便亂寫的queue去做多執行緒測試時, 並沒有發生queue去lock執行緒的問題... 但是自己寫的FloodFill,queue就一直去呼叫Lockit 到底是什麼問題 ...目前不知道..XD ※ 編輯: kight 來自: 101.14.80.209 (07/15 00:24)

07/15 23:29, , 9F
恩,我還在檢查我的幻覺,不過真的印象很深刻的樣子
07/15 23:29, 9F

07/15 23:51, , 10F
standard container thread safe ??
07/15 23:51, 10F

07/15 23:54, , 11F
用Google查_Lockit _Lock(_LOCK_DEBUG),第一筆就有跟我一樣
07/15 23:54, 11F

07/15 23:55, , 12F
的問題..不過那解決方法我試了之後....沒用..XD
07/15 23:55, 12F

07/16 00:02, , 13F
你是build debug版本的? 你build 也一樣嗎?
07/16 00:02, 13F

07/16 00:07, , 14F
嗯...一樣..是Debug板本....
07/16 00:07, 14F

07/16 01:55, , 15F
debug 一定有thread-safe 的呀_Lockit _Lock(_LOCK_DEBUG);
07/16 01:55, 15F

07/16 01:56, , 16F
這裡有聲明,不過release的code沒看到 http://ppt.cc/B4vt
07/16 01:56, 16F

07/16 03:29, , 17F
我的意思是 請release??? 應該就沒問題了。
07/16 03:29, 17F

07/16 03:37, , 18F
對了,有thread-safe 是幻覺沒錯。
07/16 03:37, 18F

07/16 20:52, , 19F
嗯..我對Release版不是很熟,很怕跑出來的結果不對...XD
07/16 20:52, 19F

07/17 12:35, , 20F
因為 release 版少了很多保護. 包含timing問題會浮出 來
07/17 12:35, 20F
文章代碼(AID): #1G06lnSQ (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1G06lnSQ (C_and_CPP)