美文网首页区块链研习社
比特币源码研读4-程序入口函数解析(3)

比特币源码研读4-程序入口函数解析(3)

作者: Jacky_2c9f | 来源:发表于2017-10-08 16:21 被阅读0次

这是最后一个入口函数:初始化。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类,顾名思义,该类负责参数的管理。

可以看到该函数 在 util.cpp 中实现。

函数第一行代码

LOCK(cs_args);

 cs_args 是定义在util.h头文件中的类ArgsManager里面的变量,类型为 CCriticalSection。 

CCriticalSection是定义在src/sync.h文件中的类,继承于boot::recursive_mutex互斥类.

其对象表示一个临界区,同一时刻只允许一个线程存取资源或代码区。

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对象。

Tips

std::string::npos: npos是一个常数,用来表示不存在的位置,取值由实现决定,一般为-1。

作者:区块链研习社比特币源码研读班 Jacky

相关文章

网友评论

    本文标题:比特币源码研读4-程序入口函数解析(3)

    本文链接:https://www.haomeiwen.com/subject/bpzkextx.html