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

作者: henry8168 (番薯猴)   2016-03-18 17:20:33
開發平台(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):
作者: stupid0319 (徵女友)   2016-03-18 17:30:00
用儲列排隊寫入?
作者: Schottky (順風相送)   2016-03-18 17:34:00
你的 omp_test_lock 沒 lock 到的話是怎麼處理的?..... 既然如此何苦用 test,用 omp_set_lock 不就好了
作者: LiloHuang (十年一刻)   2016-03-18 20:06:00
可考慮改用 Intel TBB 的 tbb::concurrent_hash_map
作者: Schottky (順風相送)   2016-03-18 21:55:00
..... 若已經被 lock,omp_set_lock() 會 block 住,等待此 lock 被其他人釋放,才取得 lock 繼續。所以切記,一個 thread 千萬不可在手上持有 lock 時再去 set 一次,這樣就變成永遠解不開的 dead lock 了基本上 omp_set_lock 和你原本的作法沒有多少差別會 core dump 的還是會 core dump我那樣問只是懷疑你在 omp_test_lock 沒鎖到時處理有錯

Links booklink

Contact Us: admin [ a t ] ucptt.com