我不认为你就可以只用连接器来实现这一点,但你也许能够得到的东西与一些代码工作中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);
}
对于windows dlopen
变得LoadLibrary
和dlsym
成为GetProcAddress
等...但其基本思想仍然能工作。
不错的问题。请Linux/Windows解决方案也。 – 2010-09-15 13:22:54