比特币源码分析4

让我们进入AppInitMain函数

首先const CChainParams& chainparams = Params();

返回一个CChainParams类型的指针。这个类型包含了合约相关的接口,比如说产生区块GenesisBlock

然后CreatePidFile

这个就是输出详细错误的文件。

     InitSignatureCache();初始化签名执行缓冲

点进去一看是这种函数

size_t nMaxCacheSize = std::min(std::max((int64_t)0, gArgs.GetArg("-maxsigcachesize", DEFAULT_MAX_SIG_CACHE_SIZE) / 2), MAX_MAX_SIG_CACHE_SIZE) * ((size_t) 1 << 20);

size_t nElems = signatureCache.setup_bytes(nMaxCacheSize);

然后并没有什么作用,只是将缓冲区的上下限输入到日志当中

    InitScriptExecutionCache();//这个函数同上

这里开线程去执行ThreadScriptCheck

         if (nScriptCheckThreads) {

        for (int i=0; i

            threadGroup.create_thread(&ThreadScriptCheck);

    }


    CScheduler::Function serviceLoop = std::bind(&CScheduler::serviceQueue, &scheduler);

    threadGroup.create_thread(std::bind(&TraceThread, "scheduler", serviceLoop));

看不懂没关系 serviceLoop 就是scheduler的serviceQueue函数。然后开一个线程去执行serviceLoop。然后实现生产者模式。保证将来生产的一些事件顺序执行。

template void (const char* name, Callable func)

我们来看 void serviceQueue();的解释

  // To keep things as simple as possible, there is no unschedule.

    // Services the queue 'forever'. Should be run in a thread,

    // and interrupted using boost::interrupt_thread

我没看懂。看代码

while (!shouldStop()) {

        try {

            if (!shouldStop() && taskQueue.empty()) {

                reverse_lock > rlock(lock);

                // Use this chance to get more entropy

                RandAddSeedSleep();

            }

            while (!shouldStop() && taskQueue.empty()) {

                // Wait until there is something to do.

                newTaskScheduled.wait(lock);

            }

原来这个是一个循环跑队列。队列里没有任务就休眠。一旦有任务就触发处理任务的行为。

是这个任务队列是用std :: multimap实现的,map的关键表达某一时刻,map的值表达:那一时刻要执行的函数,内部使用条件变量和锁来保护multimap,还有几个bool条件

接着往下看看:

GetMainSignals().RegisterBackgroundSignalScheduler(scheduler);

/** Register a CScheduler to give callbacks which should run in the background (may only be called once) */

    GetMainSignals().RegisterWithMempoolSignals(mempool);

/** Register with mempool to call TransactionRemovedFromMempool callbacks */

首先GetMainSignals()返回CMainSignals类。

这个类的主要作用是注册一些信号。

那么是怎么注册的呢

你可能感兴趣的:(比特币源码分析4)