非线程安全共享库动态加载实现线程安全
时间:2010-05-21 来源:ssddyb
问题描述如下:现有一个共享库,不是线程安全的,但是需要使其多线程运行。这里提供一个简便的解决方案:将该共享库拷贝多份,使用不同的名字,然后在开启每个线程的时候动态加载共享库,然后在调用库的函数即可实现多线程运行。
这里自己试了个例子:
//dltest.cpp
#include "myso.h" |
动态库如下:
//myso.h
//myso.cpp |
g++ -rdynamic -shared -o libmyso1.so myso.cpp
(*项 -rdynamic 用来通知链接器将所有符号添加到动态符号表中,目的是能够通过使用 dlopen 来实现向后跟踪。-ldl 表明一定要将 dllib 链接于该程序。*见文章开头链接中介绍)
然后拷贝4份libmyso1.so,分别命名为libmyso2.so、libmyso3.so、
libmyso4.so。
这样就可以多线程运行动态库中的代码。
运行的时候,使用gdb调试时,你会发现每个动态加载的共享库里的全局变量具有不同的地址。
【注意】:不能在生成可执行文件时链接该动态库,否则达不到并行效果,此时几个动态加载的共享库里的全局变量将会同一个。