问题介绍
在执行工程的时候报错:_dl_allocate_tls_init: Assertion `listp != NULL’ failed!
问题原因
此问题的出现与dlopen、pthread_create相关。
在glibc2.31源码中,
dlopen()有下列代码段:
而在pthread_create()中进行了下列判断:
令y = listp->slotinfo[cnt].gen, x = GL(dl_tls_generation).
可以看到,进行了如下操作:
T1:
y = x + 1;
++x;
T2:
assert(y <= x);
因此当两个线程并发调用dlopen()和pthread_create()时,就有可能报错。
此问题在glibc2.34中已经修复,因此在ubuntu22.04版本就不会出现。
对此问题的相关讨论在下方给出链接:
https://sourceware.org/bugzilla/show_bug.cgi?id=19329