bitcoin 程序啟動後,有乙個專門的執行緒做任務排程, 這些任務根據指定的時刻,執行對應的函式:
排程器類主要是實現了乙個生產者消費者的任務佇列,只是這個任務佇列是用 std::multimap 實現的,map 的key表達某一時刻,map的值表達:那一時刻要執行的函式,內部使用條件變數和鎖來保護multimap ,還有幾個bool 條件:bool
()複製**
cscheduler的client 通過呼叫schedule 往內部multimap新增乙個條目; schedulefromnow 和scheduleevery 內部都是呼叫schedule 方法實現; 這三個方法屬於生產者要生產任務的方法, 任務的消費者呼叫servicequeue等待取走任務, 然後執行。 目前整個程式有乙個全域性的cscheduler例項:class cscheduler
};複製**
這個例項對應只有乙個消費者執行緒, 即唯一的後台排程器執行緒。static cscheduler scheduler;
複製**
class singlethreadedschedulerclient
主要用途是,借助cscheduler型別,保障被新增到內部鍊錶的任務,被序列執行:
基本的使用例子:class singlethreadedschedulerclient
void addtoprocessqueue(std::functionfunc);
void emptyqueue();
size_t callbackspending();
};複製**
程序啟動後, 全域性物件連線管理器connman初始化後, connman 的start 方法最後,通過scheduler 執行緒安排了乙個定時任務: 每隔15分鐘, 把connman 物件內部成員,banmap_t 型別的 setbanned, caddrman 型別的addrman 序列化到本地檔案banlist.dat 和 peers.dat。#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()
複製**
如果錢包功能編譯使能, 會讓scheduler 執行緒安排每隔500毫秒重新整理錢包狀態。
if (!connman.start(scheduler, connoptions))
bool cconnman::start(cscheduler& scheduler, const options& connoptions)
複製**
peerlogicvalidation 物件的建構函式內部, scheduler 執行緒安排每45秒執行checkforstaletipandevictpeer函式主要做兩件事:
#ifdef enable_wallet
startwallets(scheduler);
#endif
//wallet/init.cpp
void
startwallets
(cscheduler& scheduler)
}//wallet/wallet.cpp
void cwallet::postinitprocess(cscheduler& scheduler)
}複製**
關掉多餘的外出tcp 連線
根據當前時間,檢查當前節點的blockchain 的tip 是否有可能過時了,建立額外的連線同步跟上
以上就是bitoin 裡面cscheduler類的主要使用場景。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;
}}複製**
位元幣原始碼分析 任務排程器的使用
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...