假设一种环境,我们要对服务热拔插一个动态库(.so文件),所要考虑的是多线程环境的兼容,不会因为动态库替换后造成栈损毁而崩溃。
这边想到的方法就是封装一个dlopen过程作为对象实例加载(见load_so.h),当发出更新动态库时重新dlopen过程,替换原先的实例,注意这个替换过程必须是温和的、无逢的,这边我们使用智能指针实现。
具体更新的实现通过一个单例(见do_sth.h),调用Reload重新加载动态库。
我们构造一个极简单的动态库测试:
make_so.h
1
2 3 4 5 6 7 8 |
#include "say.h"
extern "C" { void Enter ( const std :: string &str ) { Say :: instance ( ). Sth (str ) ; //在这里动态库又过来调用了主程序的单件 } } |
say.h 打印消息,这边只是声明一个单例,具体实现于主程序当中
1
2 3 4 5 6 |
#include "singleton.h"
class Say : public Singleton <Say > { public : void Sth ( const std :: string &str ) ; } ; |
通过编译生test.so:
g++ make_so.cpp -fPIC -shared -pthread -rdynamic -lboost_thread -lboost_system -o test.so -L[boost库目录]
主程序 test.cpp ,用来测试这个动态库test.so
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |