原创 【ACM】數據結構與算法之左偏樹

左偏樹的定義 左偏樹(Leftist Tree)是一種可並堆(Mergeable Heap) ,它除了支持優先隊列的三個基本操作(插入,刪除,取最小節點),還支持一個很特殊的操作——合併操作。 左偏樹是一棵堆有序(Heap

原创 【C++】SFINAE "Substitution Failure Is Not An Error"

This rule applies during overload resolution of function templates: When substituting the explicitly specified or d

原创 【操作系統】I/O設備

CPU和存儲器不是操作系統惟一需要管理的資源。I/O設備也與操作系統有密切的相互影響。如圖1-6所示,I/O設備一般包括兩個部分:設備控制器和設備本身。控制器是插在電路板上的一塊芯片或一組芯片,這塊電路板物理地控制設備。它從操作系

原创 【MySQL】MySQL的存儲引擎 SHOW TABLE STATUS LIKE詳解

在文件系統中,MySQL將每個數據庫(也可以稱之爲schema)保存爲數據目錄下的一個子目錄。創建表時,MySQL會在數據庫子目錄下創建一個和表同名的.frm文件保存表的定義。例如創建一個名爲MyTable的表,MySQL會在My

原创 【MySQL】死鎖及實例說明

死鎖是指兩個或者多個事務在同一資源上相互佔用,並請求鎖定對方佔用的資源,從而導致惡性循環的現象。當多個事務試圖以不同的順序鎖定資源時,就可能會產生死鎖。多個事務同時鎖定同一個資源時,也會產生死鎖。例如,設想下面兩個事務同時處理St

原创 【Golang】使用os/exec執行命令

包: import "os/exec" 執行命令並獲得輸出結果 最簡單的例子就是運行ls -lah並獲得組合在一起的stdout/stderr輸出。 func main() { cmd := exec.Command("ls"

原创 【Bazel】C++編譯常見用例

在一個target中包含多個文件 可以利用glob在單個target中包含多個文件,例如: cc_library( name = "build-all-the-files", srcs = glob(["*.cc"

原创 【分佈式】腦裂是什麼?

什麼是腦裂 腦裂(split-brain)就是“大腦分裂”,也就是本來一個“大腦”被拆分了兩個或多個“大腦”,我們都知道,如果一個人有多個大腦,並且相互獨立的話,那麼會導致人體“手舞足蹈”,“不聽使喚”。 腦裂通常會出現在集羣環境

原创 寄存器介紹

寄存器是CPU的組成部分,因爲在CPU內,所以CPU對其讀寫速度是最快的,不需要IO傳輸,但同時也決定了此類寄存器數量非常有限,有限到幾乎每個存儲都有自己的名字,而且有些還有多個名字。 IA-32構架提供了16個基本寄存器,這16

原创 【Golang】Go unsafe Pointer

Go語言在設計的時候,爲了編寫方便、效率高以及降低複雜度,被設計成爲一門強類型的靜態語言。強類型意味着一旦定義了,它的類型就不能改變了;靜態意味着類型檢查在運行前就做了。 同時爲了安全的考慮,Go語言是不允許兩個指針類型進行轉換的

原创 【設計模式】外觀模式分析

模式定義 外觀模式(Facade Pattern):外部與一個子系統的通信必須通過一個統一的外觀對象進行,爲子系統中的一組接口提供一個一致的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。外觀模式又稱爲門面模

原创 Compare-And-Swap(CAS)詳解

在C++11中關於CAS的操作其中有兩個,分別是compare_exchange_weak和compare_exchange_strong,CAS爲什麼還有強弱之分呢? 實現CAS的操作包括兩個: 實現原子性CAS原語 實現LL

原创 【設計模式】命令模式(Command Pattern)分析及源碼

命令模式(Command Pattern)是一種數據驅動的設計模式,它屬於行爲型模式。請求以命令的形式包裹在對象中,並傳給調用對象。調用對象尋找可以處理該命令的合適的對象,並把該命令傳給相應的對象,該對象執行命令。 模式動機 在軟

原创 【Golang】Golang Template實例

golang提供了兩個標準庫用來處理模板text/template和html/template。我們使用html/template格式化html字符。 模板引擎 模板引擎很多,Python的jinja,nodejs的jade等都很

原创 【Golang】golang 幾種字符串的連接方式

直接使用運算符 func BenchmarkAddStringWithOperator(b *testing.B) { hello := "hello" world := "world" for i :=