[問題] Sparse Hash Map多執行緒的問題(threads)

看板C_and_CPP (C/C++)作者 (番薯猴)時間10年前 (2016/03/18 17:20), 10年前編輯推噓2(209)
留言11則, 3人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) google/sparsehash.h 問題(Question): 大家好。 我的某個程式要開30個threads同時執行, 但這30個核心都要共用同一個Google Sparse Hash Map, 所以我餵給這些threads的是某個Hash Table的pointer, 因此它們會共用這張Hash Table。 問題來了,這樣執行起來往往會造成core dumped, 一開始我用#pragma omp critical 將寫入這張Hash Table的程式碼(只有一行)包起來, 執行起來居然會Core dumped! 後來改成將每個讀取或寫入到這張table的程式碼都包起來, 但這顯然不是個好辦法,因為30核的效果會大打折扣,趨近於單核的速度。 後來改成針對不同的key值, 用omp_test_lock和omp_unset_lock去包住, 區別不同的critical section。 卻還是會造成core dumped! 所以開始懷疑是不是Google Sparse Hash不支援以key區分不同的執行緒的功能? 能解決這奇怪問題的我願意給500P 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.123.104.195 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1458292838.A.62D.html

03/18 17:30, , 1F
用儲列排隊寫入?
03/18 17:30, 1F
這就不太清楚了,有相關範例說明嗎?

03/18 17:34, , 2F
你的 omp_test_lock 沒 lock 到的話是怎麼處理的?
03/18 17:34, 2F
while(!omp_test_lock(locker)); 讓它自己無窮迴圈 ※ 編輯: henry8168 (140.123.104.195), 03/18/2016 18:29:58

03/18 19:34, , 3F
..... 既然如此何苦用 test,用 omp_set_lock 不就好了
03/18 19:34, 3F
如果那個locker本來就是被set成1的呢?這代表已經有其他thread在做這塊了吧, 是要怎麼卡住其他threads的執行ˊ_>ˋ?

03/18 20:06, , 4F
可考慮改用 Intel TBB 的 tbb::concurrent_hash_map
03/18 20:06, 4F
這不錯耶! 到concurrent hash table的官網,這邊大家可以載他們的source code安裝: https://www.threadingbuildingblocks.org/download#stable-releases 而這是簡單的code示範:http://goo.gl/Dqk2Xk

03/18 21:55, , 5F
..... 若已經被 lock,omp_set_lock() 會 block 住,
03/18 21:55, 5F

03/18 21:56, , 6F
等待此 lock 被其他人釋放,才取得 lock 繼續。
03/18 21:56, 6F

03/18 21:58, , 7F
所以切記,一個 thread 千萬不可在手上持有 lock 時
03/18 21:58, 7F

03/18 21:58, , 8F
再去 set 一次,這樣就變成永遠解不開的 dead lock 了
03/18 21:58, 8F
好像是你說的這樣沒錯!不過我剛改用omp_set_lock()和omp_unset_lock()去包住, Sparse Hash還是會core dumped耶...。 感覺是Google Sparse Hash本身就不支援同時讀取? ※ 編輯: henry8168 (36.236.72.170), 03/18/2016 22:20:09

03/18 22:24, , 9F
基本上 omp_set_lock 和你原本的作法沒有多少差別
03/18 22:24, 9F

03/18 22:25, , 10F
會 core dump 的還是會 core dump
03/18 22:25, 10F

03/18 22:26, , 11F
我那樣問只是懷疑你在 omp_test_lock 沒鎖到時處理有錯
03/18 22:26, 11F
※ 編輯: henry8168 (58.115.109.218), 03/27/2016 01:41:42
文章代碼(AID): #1MwyXcOj (C_and_CPP)
文章代碼(AID): #1MwyXcOj (C_and_CPP)