如何链接非线程安全库,以便每个线程都有自己的全局变量?

elm*_*lmo 5 c c++ ssl thread-safety sunos

我有一个程序,我链接到许多库.我在profiler上运行我的应用程序,发现在一些网络请求之后大部分时间都花在"等待"状态.这些请求是我sleeping_function()从外部库调用代码的效果.我在循环中调用此函数,该循环执行很多次,因此所有等待时间总计达到大量.

由于我无法修改,sleeping_function()我想启动一些线程并行运行我的循环的几次迭代.问题是这个函数在内部使用了一些全局变量.

有没有办法告诉SunOS上的链接器我想以一种将所有变量放在线程本地存储中的方式链接特定库?

tor*_*rak 2

我不认为\xe2\x80\x99t 认为你\xe2\x80\x99 仅使用链接器就能够实现这一目标,但你也许能够使用 C 中的某些代码来实现这一点。

\n\n

问题在于,调用加载已加载的库将返回对已加载实例的引用,而不是加载新副本。快速浏览一下dlopenLoadLibrary的文档似乎可以确认,\xe2\x80\x99s 无法多次加载同一个库,至少在您希望图像准备好执行时是这样。避免这种情况的一种方法是防止操作系统知道它是同一个库。为此,您可以复制该文件。

\n\n

一些伪代码,只需将调用替换sleeping_function为调用call_sleeping_function_thread_safe

\n\n
char *shared_lib_name\n\nvoid sleeping_function_thread_init(char *lib_name);\n\nvoid call_sleeping_function_thread_safe()\n{\n  void *lib_handle;\n  pthread_t pthread;\n  new_file_name = make_copy_of_file(shared_lib_name);\n\n  pthread_create(&pthread, NULL, sleeping_function_thread_init, new_file_name);\n}\n\nvoid sleeping_function_thread_init(char *lib_name)\n{\n  void *lib_handle;\n  void (*)() sleeping_function;\n\n  lib_handle = dlopen(lib_name, RTLD_LOCAL);\n  sleeping_function = dlsym(lib_handle, "sleeping_function")\n  while (...)\n    sleeping_function;\n  dlclose(lib_handle);\n  delete_file(lib_name);      \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于 Windows 来说dlopen,变得LoadLibrarydlsym变得GetProcAddress等等......但基本思想仍然有效。

\n