位元幣原始碼分析 任務排程器的使用

2021-09-11 10:09:00 字數 2734 閱讀 6476

bitcoin 程序啟動後,有乙個專門的執行緒做任務排程, 這些任務根據指定的時刻,執行對應的函式:

bool

()複製**

排程器類主要是實現了乙個生產者消費者的任務佇列,只是這個任務佇列是用 std::multimap 實現的,map 的key表達某一時刻,map的值表達:那一時刻要執行的函式,內部使用條件變數和鎖來保護multimap ,還有幾個bool 條件:

class cscheduler

};複製**

cscheduler的client 通過呼叫schedule 往內部multimap新增乙個條目; schedulefromnow 和scheduleevery 內部都是呼叫schedule 方法實現; 這三個方法屬於生產者要生產任務的方法, 任務的消費者呼叫servicequeue等待取走任務, 然後執行。 目前整個程式有乙個全域性的cscheduler例項:

static cscheduler scheduler;

複製**

這個例項對應只有乙個消費者執行緒, 即唯一的後台排程器執行緒。class singlethreadedschedulerclient主要用途是,借助cscheduler型別,保障被新增到內部鍊錶的任務,被序列執行:

class singlethreadedschedulerclient 

void addtoprocessqueue(std::functionfunc);

void emptyqueue();

size_t callbackspending();

};複製**

基本的使用例子:

#include #include #include #include #include static void don()

static void doe()

std::cout << '\n';

}boost_auto_test_suite(sche_tests)

boost_auto_test_case(sche)

); t.interrupt();

t.join();

}boost_auto_test_case(singlethread)

; sc.addtoprocessqueue(f);

}boost::thread t(boost::bind(&cscheduler::servicequeue, &s));

boost::this_thread::sleep_for(boost::chrono::seconds);

t.interrupt();

t.join();

}boost_auto_test_suite_end()

複製**

程序啟動後, 全域性物件連線管理器connman初始化後, connman 的start 方法最後,通過scheduler 執行緒安排了乙個定時任務: 每隔15分鐘, 把connman 物件內部成員,banmap_t 型別的 setbanned, caddrman 型別的addrman 序列化到本地檔案banlist.dat 和 peers.dat。

if (!connman.start(scheduler, connoptions))

bool cconnman::start(cscheduler& scheduler, const options& connoptions)

複製**

如果錢包功能編譯使能, 會讓scheduler 執行緒安排每隔500毫秒重新整理錢包狀態。

#ifdef enable_wallet

startwallets(scheduler);

#endif

//wallet/init.cpp

void

startwallets

(cscheduler& scheduler)

}//wallet/wallet.cpp

void cwallet::postinitprocess(cscheduler& scheduler)

}複製**

peerlogicvalidation 物件的建構函式內部, scheduler 執行緒安排每45秒執行checkforstaletipandevictpeer函式主要做兩件事:

關掉多餘的外出tcp 連線

根據當前時間,檢查當前節點的blockchain 的tip 是否有可能過時了,建立額外的連線同步跟上

peerlogicvalidation::peerlogicvalidation(cconnman* connmanin, cscheduler &scheduler) : connman(connmanin), m_stale_tip_check_time(0) 

void peerlogicvalidation::checkforstaletipandevictpeers(const consensus::params &consensusparams)

else

if (connman->gettrynewoutboundpeer())

m_stale_tip_check_time = time_in_seconds + stale_check_interval;

}}複製**

以上就是bitoin 裡面cscheduler類的主要使用場景。

位元幣原始碼分析 任務排程器的使用

bitcoin 程序啟動後,有乙個專門的執行緒做任務排程,這些任務根據指定的時刻,執行對應的函式 排程器類主要是實現了乙個生產者消費者的任務佇列,只是這個任務佇列是用 std multimap 實現的,map 的key表達某一時刻,map的值表達 那一時刻要執行的函式,內部使用條件變數和鎖來保護mu...

位元幣原始碼分析 多執行緒檢查指令碼

多執行緒指令碼檢查啟動 bool config config,boost thread group threadgroup,cscheduler scheduler static ccheckqueuescriptcheckqueue 128 void threadscriptcheck 複製 任務...

linux排程器原始碼分析 初始化 二

上期文章linux排程器原始碼分析 概述 一 已經把排程器相關的資料結構介紹了一遍,本篇著重通過 說明排程器在系統啟動初始化階段是如何初始化和工作的。通過上期文章我們知道,在多核cpu和smp系統中,每個cpu 多核cou中的每個核 都有自己的struct rq佇列,而rq佇列中又有著自己的stru...