Я не думаю, что вы сможете достичь этого только с помощью компоновщика, но вы можете получить что-то, работающее с некоторым кодом в C.
Проблема в том, что вызов loadбиблиотека, которая уже загружена, возвратит ссылку на уже загруженный экземпляр вместо загрузки новой копии.Беглый взгляд на документацию для dlopen и LoadLibrary , кажется, подтверждает, что невозможно загрузить одну и ту же библиотеку более одного раза, по крайней мере, если вы хотите, чтобы изображение было подготовленовыполнение.Один из способов обойти это - запретить ОС знать, что это одна и та же библиотека.Для этого вы можете сделать копию файла.
Какой-то псевдокод, просто замените звонки на sleeping_function
звонками на call_sleeping_function_thread_safe
:
char *shared_lib_name
void sleeping_function_thread_init(char *lib_name);
void call_sleeping_function_thread_safe()
{
void *lib_handle;
pthread_t pthread;
new_file_name = make_copy_of_file(shared_lib_name);
pthread_create(&pthread, NULL, sleeping_function_thread_init, new_file_name);
}
void sleeping_function_thread_init(char *lib_name)
{
void *lib_handle;
void (*)() sleeping_function;
lib_handle = dlopen(lib_name, RTLD_LOCAL);
sleeping_function = dlsym(lib_handle, "sleeping_function")
while (...)
sleeping_function;
dlclose(lib_handle);
delete_file(lib_name);
}
Для Windows dlopen
становится LoadLibrary
и dlsym
становится GetProcAddress
и т. д. ... но основная идея все равно будет работать.