比特幣源碼研讀4-程序入口函數(shù)解析(3)

這是最后一個入口函數(shù):初始化。AppInit() 函數(shù)在 src/bitcoind.cpp 中實現(xiàn)。

bool AppInit(int argc, char* argv[])

{

boost::thread_group threadGroup;

CScheduler scheduler;

首先函數(shù)定義了兩個變量,

boost::thread_group threadGroup:線程組,作用為實現(xiàn)對多個線程的統(tǒng)一管理;

CScheduler scheduler: 任務(wù)管理類,用于需要周期執(zhí)行或某一時刻執(zhí)行某一任務(wù),其頭文件為 src/Scheduler.h,實現(xiàn)文件為src/Scheduler.cpp。

初始化第一個函數(shù) ParseParameters(argc, argv), 作用是解析參數(shù) argc, argv.?

//

// Parameters

//

// If Qt is used, parameters/bitcoin.conf are parsed in qt/bitcoin.cpp's main()

?ParseParameters(argc, argv);

函數(shù) ParseParameters(argc, argv)于src/util.h文件中定義。

調(diào)用者gArgs是定義在util.h 中的ArgsManager類,顧名思義,該類負(fù)責(zé)參數(shù)的管理。

可以看到該函數(shù)?在 util.cpp 中實現(xiàn)。

函數(shù)第一行代碼

LOCK(cs_args);

?cs_args?是定義在util.h頭文件中的類ArgsManager里面的變量,類型為?CCriticalSection。?

CCriticalSection是定義在src/sync.h文件中的類,繼承于boot::recursive_mutex互斥類.

其對象表示一個臨界區(qū),同一時刻只允許一個線程存取資源或代碼區(qū)。

Critical Section的作用:限制多線程訪問全局變量或共享變量、對象或內(nèi)存空間,即防止全局變量或內(nèi)存被其他線程所修改。


接著再回到函數(shù)第一行中,關(guān)于LOCK的定義, 同樣在src/sync.h文件中

#define LOCK(cs) CCriticalBlock PASTE2(criticalblock, __COUNTER__)(cs, #cs, __FILE__, __LINE__)

可以看出是宏定義,與前面的CCriticalSection 對象結(jié)合,實現(xiàn)加鎖互斥目的,避免多線程問題。

Tips: 關(guān)于宏定義,詳情參考:http://blog.chinaunix.net/uid-21372424-id-119797.html?

加了鎖之后,就進(jìn)行兩個參數(shù)變量map的清空操作:

mapArgs.clear();

mapMultiArgs.clear();

這兩個參數(shù)也跟在CCriticalSection后面定義了。

隨后通過 for 循環(huán),將參數(shù)值進(jìn)行解析。從argv中取出參數(shù),接著進(jìn)行一些處理操作,如針對32位系統(tǒng),將參數(shù)名轉(zhuǎn)為小寫,并替換“/”為“-”;針對開頭有連續(xù)兩個“-”,則去除其中一個。最后將 key/value 存到連個Map對象。

Tips

std::string::npos: npos是一個常數(shù),用來表示不存在的位置,取值由實現(xiàn)決定,一般為-1。

作者:區(qū)塊鏈研習(xí)社比特幣源碼研讀班 Jacky

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這一節(jié)將繼續(xù)講解入口函數(shù)AppInit 里面的參數(shù)處理和日志初始化操作。 入口函數(shù)文件:bitcoind.cpp ...
    Jacky_2c9f閱讀 469評論 0 0
  • 上一篇文章我們大致分析了一下比特幣源碼src文件夾的目錄結(jié)構(gòu)以及數(shù)據(jù)目錄結(jié)構(gòu),接下來我們將進(jìn)入源碼的分析。本篇涉及...
    自如致知閱讀 1,638評論 2 1
  • 夢李白(一)杜甫死別已吞聲,生別常惻惻。江南瘴癘地,逐客無消息。故人入我夢,明我長相憶。君今在羅網(wǎng),何以有羽翼?恐...
    謝小樓閱讀 1,105評論 0 1
  • 今天早上什么都不想干。
    沙之墨閱讀 349評論 0 0
  • 對于一位工作11個年頭的我來說,覺得已到中年,特別是覺得腦袋有點不好使了。今天看了一篇研究報告,得出的結(jié)論是人到...
    williie007閱讀 253評論 0 0

友情鏈接更多精彩內(nèi)容