這是最后一個入口函數(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