这是最后一个入口函数:初始化。AppInit() 函数在 src/bitcoind.cpp 中实现。
bool AppInit(int argc, char* argv[])
{
boost::thread_group threadGroup;
CScheduler scheduler;
首先函数定义了两个变量,
boost::thread_group threadGroup:线程组,作用为实现对多个线程的统一管理;
CScheduler scheduler: 任务管理类,用于需要周期执行或某一时刻执行某一任务,其头文件为 src/Scheduler.h,实现文件为src/Scheduler.cpp。
初始化第一个函数 ParseParameters(argc, argv), 作用是解析参数 argc, argv.
//
// Parameters
//
// If Qt is used, parameters/bitcoin.conf are parsed in qt/bitcoin.cpp's main()
ParseParameters(argc, argv);
函数 ParseParameters(argc, argv)于src/util.h文件中定义。
调用者gArgs是定义在util.h 中的ArgsManager类,顾名思义,该类负责参数的管理。
![](https://img.haomeiwen.com/i4916340/3d902c985ac67f41.png)
可以看到该函数 在 util.cpp 中实现。
![](https://img.haomeiwen.com/i4916340/36fbef7d7395e2df.png)
函数第一行代码
LOCK(cs_args);
cs_args 是定义在util.h头文件中的类ArgsManager里面的变量,类型为 CCriticalSection。
![](https://img.haomeiwen.com/i4916340/45e11107a0dc9f94.png)
CCriticalSection是定义在src/sync.h文件中的类,继承于boot::recursive_mutex互斥类.
其对象表示一个临界区,同一时刻只允许一个线程存取资源或代码区。
![](https://img.haomeiwen.com/i4916340/821fdd92442f0054.png)
Critical Section的作用:限制多线程访问全局变量或共享变量、对象或内存空间,即防止全局变量或内存被其他线程所修改。
接着再回到函数第一行中,关于LOCK的定义, 同样在src/sync.h文件中
#define LOCK(cs) CCriticalBlock PASTE2(criticalblock, __COUNTER__)(cs, #cs, __FILE__, __LINE__)
可以看出是宏定义,与前面的CCriticalSection 对象结合,实现加锁互斥目的,避免多线程问题。
Tips: 关于宏定义,详情参考:http://blog.chinaunix.net/uid-21372424-id-119797.html
加了锁之后,就进行两个参数变量map的清空操作:
mapArgs.clear();
mapMultiArgs.clear();
这两个参数也跟在CCriticalSection后面定义了。
随后通过 for 循环,将参数值进行解析。从argv中取出参数,接着进行一些处理操作,如针对32位系统,将参数名转为小写,并替换“/”为“-”;针对开头有连续两个“-”,则去除其中一个。最后将 key/value 存到连个Map对象。
![](https://img.haomeiwen.com/i4916340/083e262c7f7256ae.png)
Tips
std::string::npos: npos是一个常数,用来表示不存在的位置,取值由实现决定,一般为-1。
作者:区块链研习社比特币源码研读班 Jacky
网友评论