我不認爲你就可以只用連接器來實現這一點,但你也許能夠得到的東西與一些代碼工作中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