青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運轉,開心的工作
簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

Linux下C++ hot reload

Posted on 2011-07-01 17:03 S.l.e!ep.¢% 閱讀(1362) 評論(0)  編輯 收藏 引用 所屬分類: Unix

Linux下C++熱加載實例

Friday, 3. June 2011 - 16:21 |1 comment ?

假設一種環境,我們要對服務熱拔插一個動態庫(.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
67
68
69
#include <boost/thread.hpp>
#include "load_so.h"
#include "say.h"

class DoSth :public Singleton
{
? ? public:
? ? ? ? DoSth():m_so(new LoadSo("./test.so"))
? ? ? ? {
? ? ? ? }

? ? ? ? DynamicSo_ptr Get()
? ? ? ? {
? ? ? ? ? ? boost::mutex::scoped_lock lock(m_mtx);
? ? ? ? ? ? return m_so;
? ? ? ? }

? ? ? ? void Reload()
? ? ? ? {
? ? ? ? ? ? boost::mutex::scoped_lock lock(m_mtx);
? ? ? ? ? ? m_so.reset(new LoadSo("./test.so"));
? ? ? ? }
? ? private:
? ? ? ? DynamicSo_ptr m_so;
? ? ? ? boost::mutex m_mtx;
};



/// Say
void Say::Sth(const std::string&str)
{
? ? std::cout<< str << std::endl;
}




////////////////////////// 測試代碼 //////////////////////////////////////

//更新動態庫
void test()
{
? ? for(int i=0;i<100;++i)
? ? {
? ? ? ? sleep(1);
? ? ? ? DoSth::instance().Reload();
? ? }
}

//運行動態庫
void test2()
{
? ? for(int i=0;irun("12");
? ? }
}

int main()
{
? ? std::cout<<"run\n";

? ? boost::thread thread1(&test2);
? ? boost::thread thread2(&test);

? ? thread1.join();
? ? thread2.join();

? ? return0;
}

編譯主程序:

g++ -Wall test2.cpp -o test2 -pipe -pthread -ldl -Wl,–export-dynamic -lboost_system -lboost_thread -L[boost庫目錄]

這邊一定要加“-Wl,–export-dynamic”以便導出主程序的符號供動態庫回調。

編譯成功后生成 test 可執行文件,運行:

#./test
run
12
12
12
12
….

假設這時我們修改 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 +",ab"); ? //修改輸出
? ? }
}

g++ make_so.cpp -fPIC -shared -pthread -rdynamic -lboost_thread -lboost_system -o test.so -L[boost庫目錄]
重新編譯后,這時我們主程序會馬上響應,輸出:

12,ab
12,ab
12,ab
12,ab
….

說明熱替換是成功的。

在實際運用中,當要替換動態庫時可以在程序中使用
DoSth::instance().Reload();
具體方法很多,可以通過socket、中斷信號、監聽文件系統、定時更新等方式。

load_so.h 代碼:

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
#ifndef LOAD_SO_H
#define LOAD_SO_H

#include
#include
#include
using namespace std;

class LoadSo
{
? ? typedefvoid(*Func)(const std::string&suid);
? ? public:
? ? ? ? LoadSo(constchar* so_file)
? ? ? ? {
? ? ? ? ? ? load(so_file);
? ? ? ? }

? ? ? ? ~LoadSo()
? ? ? ? {
? ? ? ? ? ? Close();
? ? ? ? }

? ? ? ? void Close()
? ? ? ? {
? ? ? ? ? ? dlclose(m_handle);
? ? ? ? }

? ? ? ? void run(const std::string&str )
? ? ? ? {
? ? ? ? ? ? m_func(str);
? ? ? ? }
? ? private:
? ? ? ? bool load(constchar* so_file)
? ? ? ? {
? ? ? ? ? ? m_handle = dlopen(so_file, RTLD_LAZY);
? ? ? ? ? ? if(!m_handle){
? ? ? ? ? ? ? ? std::string error("Cannot open library: ");
? ? ? ? ? ? ? ? throw std::runtime_error(error + dlerror());
? ? ? ? ? ? ? ? returnfalse;
? ? ? ? ? ? }

? ? ? ? ? ? dlerror();
? ? ? ? ? ? m_func =(Func) dlsym(m_handle, "Enter");
? ? ? ? ? ? constchar*dlsym_error = dlerror();
? ? ? ? ? ? if(dlsym_error){
? ? ? ? ? ? ? ? dlclose(m_handle);
? ? ? ? ? ? ? ? std::string error("Cannot load symbol: ");
? ? ? ? ? ? ? ? throw std::runtime_error(error + dlsym_error);
? ? ? ? ? ? ? ? returnfalse;
? ? ? ? ? ? }
? ? ? ? ? ? returntrue;
? ? ? ? }

? ? ? ? Func m_func;
? ? ? ? void* m_handle;
};
typedef boost::shared_ptr DynamicSo_ptr;

#endif

說在最后,我在一些測試中發現有時并不自動切換到新的動態庫的情況,另一個做法就是備用兩個動態庫,那么在Reload時在兩個so文件之間切換,這樣可以確保更新,額外給自己找的好處是可以保留舊版本的so。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品免费aⅴ片在线观看| 国产一区二区久久久| 暖暖成人免费视频| 国产女主播一区二区三区| 亚洲精品乱码久久久久久日本蜜臀 | 欧美三级日韩三级国产三级| 久久精品国产清高在天天线 | 亚洲人成网站在线播| 欧美综合国产精品久久丁香| 一本到高清视频免费精品| 欧美a级一区二区| 亚洲高清在线观看| 免费亚洲电影在线观看| 久久9热精品视频| 国产午夜精品福利| 久久久久久9999| 久久xxxx| 悠悠资源网久久精品| 久久青草欧美一区二区三区| 欧美一区中文字幕| 精品成人免费| 欧美国产一区视频在线观看| 久久综合激情| 亚洲三级影院| 亚洲美女淫视频| 欧美偷拍另类| 欧美在线电影| 欧美在线中文字幕| 在线精品观看| 亚洲日本成人女熟在线观看| 老司机成人在线视频| 国外成人免费视频| 男人的天堂亚洲| 欧美大片免费观看| 亚洲一区二区三区精品视频| 亚洲欧美另类在线观看| 国模精品一区二区三区| 欧美丰满高潮xxxx喷水动漫| 欧美欧美午夜aⅴ在线观看| 亚洲女性喷水在线观看一区| 久久av在线| 亚洲日韩欧美一区二区在线| 艳女tv在线观看国产一区| 国产毛片精品视频| 欧美成人激情在线| 欧美色图天堂网| 久久精品国产77777蜜臀| 米奇777超碰欧美日韩亚洲| 99一区二区| 久久福利精品| 在线亚洲+欧美+日本专区| 校园春色国产精品| 夜夜嗨av一区二区三区网页| 亚洲欧美三级伦理| 日韩亚洲一区二区| 欧美中日韩免费视频| 999在线观看精品免费不卡网站| 亚洲午夜高清视频| 亚洲二区视频| 午夜一区不卡| 亚洲视频一二| 欧美mv日韩mv国产网站app| 午夜欧美理论片| 欧美电影免费观看| 久久久一二三| 国产精品视频成人| 亚洲精华国产欧美| 在线精品一区二区| 免费在线日韩av| 欧美专区福利在线| 久久国产一区| 国产女精品视频网站免费 | 亚洲欧美日韩综合一区| 亚洲精品日韩一| 国产精品亚洲综合一区在线观看| 免费一级欧美在线大片| 亚洲欧洲在线免费| 亚洲一区二区影院| 亚洲国产精品第一区二区| 亚洲视频在线播放| 9国产精品视频| 久久视频一区二区| 欧美在线视频播放| 国产精品丝袜久久久久久app| 亚洲国产精品成人综合色在线婷婷 | 亚洲一区二区三区四区在线观看 | 亚洲激情第一页| 久久精品国产精品亚洲| 欧美在线观看一区二区三区| 国产精品成人国产乱一区 | 国内精品视频久久| 校园激情久久| 久久久国产视频91| 国外成人在线视频| 久久人体大胆视频| 老司机免费视频一区二区三区| 国内精品写真在线观看| 久久久久久伊人| 欧美成人中文字幕在线| 亚洲区第一页| 欧美日韩美女在线| 亚洲影院在线| 另类图片国产| 日韩一级成人av| 国产精品成人在线观看| 性感少妇一区| 欧美国产第一页| 夜夜狂射影院欧美极品| 国产精品videossex久久发布| 亚洲私人影院| 久久国产黑丝| 亚洲国产精品欧美一二99| 欧美日本亚洲| 亚洲香蕉网站| 久久精品在线播放| 在线观看日韩av| 99精品视频免费在线观看| 亚洲综合色网站| 国产欧美精品日韩| 欧美国产综合视频| 亚洲永久精品大片| 国产精品成人观看视频免费| 亚洲午夜在线观看视频在线| 欧美一级久久久| 亚洲欧美综合v| 一区二区欧美亚洲| 99精品视频网| 欧美三区免费完整视频在线观看| 日韩视频免费观看高清在线视频 | 欧美激情视频一区二区三区在线播放| 激情综合久久| 欧美视频不卡| 欧美一区二区三区另类| 久久人人97超碰国产公开结果| 一色屋精品视频免费看| 欧美99久久| 亚洲另类春色国产| 久久久久久久欧美精品| 亚洲国产精品一区二区久| 欧美精品18+| 亚洲免费在线观看| 亚洲伊人久久综合| 亚洲国产成人porn| 欧美日韩免费区域视频在线观看| 宅男精品导航| 美女主播一区| 亚洲性人人天天夜夜摸| 亚洲韩国青草视频| 国产精品伦一区| 葵司免费一区二区三区四区五区| 亚洲乱码国产乱码精品精98午夜| 午夜亚洲福利| 国产精品五区| 欧美午夜精品久久久久久孕妇| 午夜亚洲视频| 99xxxx成人网| 欧美大片免费久久精品三p | 亚洲一区二区三区777| 国一区二区在线观看| 欧美日韩国产在线播放网站| 亚洲欧美久久久久一区二区三区| 亚洲第一在线综合在线| 欧美激情一区二区三区在线视频观看 | 先锋影音一区二区三区| 亚洲电影成人| 久久久久看片| 亚洲免费在线| 韩日在线一区| 狠狠爱www人成狠狠爱综合网| 欧美日韩一区二区三区免费看| 欧美综合国产精品久久丁香| 亚洲最新视频在线| 亚洲黄色尤物视频| 亚洲韩国青草视频| 免费视频久久| 久久人人97超碰国产公开结果| 亚洲一级二级在线| 亚洲毛片在线观看.| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 国产精品国产三级国产aⅴ9色| 美日韩免费视频| 久久精品免视看| 亚洲免费在线| 在线亚洲伦理| 亚洲精品婷婷| 免费试看一区| 久久综合中文色婷婷| 久久se精品一区二区| 亚洲欧美三级伦理| 中文精品视频一区二区在线观看| 欧美日本乱大交xxxxx| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 99精品欧美一区| 亚洲网址在线| 亚洲视频一二三| 亚洲欧美日韩一区二区三区在线| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 狠狠色香婷婷久久亚洲精品| 国产一区二区在线观看免费播放| 国产日韩欧美中文|