最近在写一些需要多线程加速的东西。受可重入性影响,卡了很久。通过gdb,发现了这样的问题。
srand,rand内部拥有静态变量来记录随机上下文的种子。只要使用了这俩函数的函数,在多线程共用的时候,会被锁上。(如图)一旦超过了一定数量的线程,就会导致死锁。
这种在debug别人的库和代码的时候,日子就不那么好过了。真·不好过。
其次是malloc问题。这里malloc指glibc-malloc。malloc为了保证内存分配的线性性,是不可重入的,否则会遇到不可预测的结果。一些老项目,m4ri之徒,内部调用了这玩意儿导致调库仔(我)会莫名其妙地出错。现在用tcmalloc来替代,据说可以并行化分配内存。原理……没有空去了解hhh,先把ddl给干完。