我认为您无法仅使用链接器来实现此目的,但是您也许可以使用 C 中的某些代码来获得一些东西。
问题是调用加载已加载的库将返回对已加载实例的引用,而不是加载新副本。快速查看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);
}
对于 windowsdlopen
成为LoadLibrary
并dlsym
成为GetProcAddress
等等......但基本的想法仍然有效。