Author Archives: Enrico

library使用注意macro define

在使用第三方函式庫時,要注意build library和use library(shared, static)的macro選項 例如: CURL_STATICLIB 或是header only選項 cppnetlib BOOST_NETWORK_NO_LIB 另外是注意編譯時的macro define,有可能使用時須要一致。 以後有注意到再繼續補

Posted in Tips | Leave a comment

int() = 0

顯式的使用 int() 會回傳0int a = int(); //a=0這個在語法上看起來「像」是constructor,而效果上也很「像」constructor (default value = 0) 那麼這個語法的值是怎麼被決定的呢?參考c++03 5.2.3 Explicit type conversion (functional notation) 的第二點 The expression T(), where T is a simple-type-specifier (7.1.5.2) for a non-array complete object type or the (possibly cv-qualified) void type, … Continue reading

Posted in C++ Language | Leave a comment

reliability & availability

在系統設計中,有時會關注reliability, availability這兩個特性。reliability 是可靠度而availability是可用度。 這是兩個完全不同的概念(但要看定義)。在可靠度工程裡有比較嚴謹的數學定義,這邊只做qualitative概念性的描述。 Dependability, or reliability, describes the ability of a system or component to function under stated conditions for a specified period of time (節錄 https://en.wikipedia.org/wiki/Reliability_engineering) reliability 指的是系統在一段時間內是否正常運作,而availability指的是在一段時間內系統可以使用的時間比例 (這邊在不同的context下可能會有不同的定義方式,例如CAP裡論證的availability是以response time來定義availability) a measure of the degree of a system … Continue reading

Posted in Distributed | Leave a comment

2PC – an interesting analogy

interesting analogy主要是後面提到的marriage vows描述,2PC (two phase commit 兩階段提交) 是在transaction processing裡的一種protocol,主要是為了要保證atomic operation,在transaction或database裡的atomic指的是 all occur, or nothing occurs. 在transaction裡一系列的操作生效 或是 當作沒發生過。2PC是在分布式系統中,需要transaction時的基本做法,有一些算法也是基於2PC所遇到的問題進行改良(如3PC) 2PC主要是提供在分布式環境多節點的atomic演算法,這邊的節點有可能是不同主機或process 舉例來說,銀行的轉帳,A帳戶的錢轉到B帳戶所需要的操作是 1. A扣掉轉的錢(&手續費) 2. B帳戶的錢增加 (這兩個操作可能是發生在不同地方的主機) 這兩個操作應當是視為一整體,也就是當使用者按下確認轉帳後 因為某些原因如網路或設備故障造成交易無法完成時,系統必須回復到交易前的狀態(就如同沒發生過),否則可能會造成A帳戶的錢扣了,而B帳戶的錢沒增加。 因為假設操作節點有可能故障,這樣的設計必須是可以failure recovery的,當失敗時可以回復狀態(無論是多節點中其他節點的失敗或是自己本身的故障如斷電),要能夠進行這樣的recovery 必須要有durability來紀錄操作歷史以便復原。所以一般會用redo log, undo log紀錄操作在非揮發性的儲存上面。 另外因為牽涉多節點的協調,所以很自然會有一個協調者的角色。這個協調者通知與蒐集所有節點的回報來確認操作是否成功或失敗。(commit or abort) 這個演算法分成兩階段 1. commit-request phase … Continue reading

Posted in Distributed | Leave a comment

gcc turn off exceptions:-fno-exceptions

在g++編譯時,程式若為了效能考量可能希望減少執行時對exception機制的overhead,可用-fno-exceptions 這個選項關掉exception 但此時就無法使用try catch 可用 #if __cpp_exceptions 來做處理, 或是使用c processor的predefined macro https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html __EXCEPTIONS This macro is defined, with value 1, when compiling a C++ source file with exceptions enabled. If -fno-exceptions is used when compiling the file, then this macro … Continue reading

Posted in Tips | Leave a comment

VS2015 – copy header files

use post build event 利用帶入巨集變數$(SolutionDir),在powershell script讀取SolutionDir powershell -ExecutionPolicy Unrestricted $(SolutionDir)\copyheader.ps1 -SolutionDir $(SolutionDir) copyheader.ps1 param([string]$SolutionDir); $src1 = $SolutionDir + “Http” $dest1 = $SolutionDir + “output\http” Copy-Item -Path $src1 -Filter “*.h” -Recurse -Destination $dest1 -Container -force -force 強制overwrite 這樣會recursive的複製.h檔到對應的目錄 試過xcopy bat,比較起來powershell script處理方式較簡潔

Posted in Tips | Leave a comment

protected destructor

constructor access modifier 一般設為public,而在singleton中,為了限制生成的物件個數,會將constructor放在private,另外在其他method生成物件。而對於destructor,以Meyers Singleton的實作來說,destructor放在public or non-public皆可,因為static object 在宣告的地方可以存取到private destructor(參考下面12.4) C++03 std §3.6.3 Termination Destructors (12.4) for initialized objects of static storage duration (declared at block scope or at namespace scope) are called as a result of returning from main … Continue reading

Posted in C++ Language | Leave a comment

object slicing

object slicing發生在衍生類別的物件複製到基類時,預設只複製基類的成員,這時候在衍生類別的資訊會遺失。 這樣有可能造成在執行method或是destructor因為遺失了資訊而造成其他錯誤。 當複製為參考時(base class reference type),則不會有此問題。 object slicing的問題,在exception catch時要特別注意,應該要catch reference(catch(A& a)才不會造成object slicing),而不是catch value 如下面範例: 如果是 catch(A a) 會走copy ctor的路,因為是將B()複製到a,而造成object slicing,並且因為copy後,catch到的物件已經不是當時拋出的那個物件了 參考: https://en.wikipedia.org/wiki/Object_slicing https://stackoverflow.com/questions/274626/what-is-object-slicing http://ptgmedia.pearsoncmg.com/images/0321113586/items/sutter_item73.pdf

Posted in C++ idioms | Leave a comment

std::make_shared

//C++11中的 shared_ptr初始化一般使用 std::shared_ptr p(new A); //但也可以 std::shared_ptr p = std::make_shared(); 使用make_shared可以避免顯式地使用new,另外主要的差別在make_shared 一般會將shared_ptr內的control block和object一起allocate。雖然一次allocate上比較有效率,但如果有用到weak_ptr,當shared count = 0時,不會馬上還回記憶體,因為control block還需要用到,而是要等到沒有任何shared_ptr, weak_ptr參考時,才會釋放記憶體。 在N3690文件 20.9.2.2.6 shared_ptr creation 中提到: Remarks: Implementations should perform no more than one memory allocation. [ Note: This provides efficiency equivalent to … Continue reading

Posted in C++ Language | Leave a comment

wait on thread creation

下面的範例是一般worker thread的做法,利用boost threadgroup,在程式一開始由一個thread進入(main thread),離開的時候也是一個thread 一般來說在創建thread時不需要等待thread被創建完成再往下走,不過這裡示範了當所有thread建立完成後main thread才繼續往下執行(透過condition variable, wait) 這麼做可以讓控制流變的簡潔,並且視thread group的threads為一整體,也能確保在start()完成之前不會執行stop()。 ThreadManager.h #include #include #include #include #include class ThreadManager { std::mutex m; std::condition_variable cv; int numThreads = 5; //non-static data member with initializer (C++11) int startCount = 0; bool bRunning = … Continue reading

Posted in Tips | Leave a comment