我需要在不同线程中的执行时间(> 100000)中加载一个共享库,以进行并行执行。我无权访问此共享库的源代码,它使用了许多全局变量。这就是为什么我想在此共享库中加载X倍的时间。
我尝试使用dlmopen执行此操作,但实际上从我的测试来看,似乎同时限制在15 dlmopen左右。
void launch(int num) {
void (*test)(int);
char *error;
void *handle = dlmopen(LM_ID_NEWLM, "/path/to/lib/libshared.so", RTLD_LAZY | RTLD_LOCAL);
if (handle == NULL) {
std::cout << "Load shared lib [FAILED] in thread: " << num << std::endl;
return ;
}
dlerror();
*(void **) (&test) = dlsym(handle, "thread");
if ((error = dlerror()) != NULL) {
fprintf(stdin, "%s\n", error);
exit(EXIT_FAILURE);
}
(*test)(num);
dlclose(handle);
}
int main(int ac, char **av) {
try {
std::vector<std::thread *> vec;
for (int counter = 0; counter < 100; ++counter) {
std::thread *t1 = new std::thread(launch, counter);
vec.push_back(t1);
}
for (std::vector< std::thread* >::iterator it = vec.begin() ; it != vec.end(); ++it) {
(*it)->join();
delete (*it);
}
vec.clear();
} catch(std::exception const &e) {
std::cerr << "[ERROR]: " << e.what() << std::endl;
return(EXIT_FAILURE);
}
return 0;
}
执行15个线程后,对dlmopen的调用失败,您有想法还是另一种方法?
答案 0 :(得分:0)
经过研究,似乎在程序启动时,动态链接程序将计算所有偏移量,并确保所有线程都有足够的空间用于所有必需的线程局部变量。
使用dlopen时,这通常无法正常工作,因为无法四处移动线程控制块来为更多线程局部变量腾出空间。当前的glibc动态链接器为将来的dlopen调用保留了一些空间,但是如果加载多个共享对象,每个共享对象都使用自己的线程局部变量,这是不够的。这就是为什么我无法在静态TLS块中分配内存的原因
glibc实现最多支持16个名称空间。我必须找到其他解决方案。