作者henry8168 (番薯猴)
看板C_and_CPP
标题[问题] Sparse Hash Map多执行绪的问题(threads)
时间Fri Mar 18 17:20:33 2016
开发平台(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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1458292838.A.62D.html
1F:推 stupid0319: 用储列排队写入? 03/18 17:30
这就不太清楚了,有相关范例说明吗?
2F:→ Schottky: 你的 omp_test_lock 没 lock 到的话是怎麽处理的? 03/18 17:34
while(!omp_test_lock(locker));
让它自己无穷回圈
※ 编辑: henry8168 (140.123.104.195), 03/18/2016 18:29:58
3F:→ Schottky: ..... 既然如此何苦用 test,用 omp_set_lock 不就好了 03/18 19:34
如果那个locker本来就是被set成1的呢?这代表已经有其他thread在做这块了吧,
是要怎麽卡住其他threads的执行ˊ_>ˋ?
4F:推 LiloHuang: 可考虑改用 Intel TBB 的 tbb::concurrent_hash_map 03/18 20:06
这不错耶!
到concurrent hash table的官网,这边大家可以载他们的source code安装:
https://www.threadingbuildingblocks.org/download#stable-releases
而这是简单的code示范:
http://goo.gl/Dqk2Xk
5F:→ Schottky: ..... 若已经被 lock,omp_set_lock() 会 block 住, 03/18 21:55
6F:→ Schottky: 等待此 lock 被其他人释放,才取得 lock 继续。 03/18 21:56
7F:→ Schottky: 所以切记,一个 thread 千万不可在手上持有 lock 时 03/18 21:58
8F:→ Schottky: 再去 set 一次,这样就变成永远解不开的 dead lock 了 03/18 21:58
好像是你说的这样没错!不过我刚改用omp_set_lock()和omp_unset_lock()去包住,
Sparse Hash还是会core dumped耶...。
感觉是Google Sparse Hash本身就不支援同时读取?
※ 编辑: henry8168 (36.236.72.170), 03/18/2016 22:20:09
9F:→ Schottky: 基本上 omp_set_lock 和你原本的作法没有多少差别 03/18 22:24
10F:→ Schottky: 会 core dump 的还是会 core dump 03/18 22:25
11F:→ Schottky: 我那样问只是怀疑你在 omp_test_lock 没锁到时处理有错 03/18 22:26
※ 编辑: henry8168 (58.115.109.218), 03/27/2016 01:41:42