原创 gettimeofday和clock_gettime是不是系統調用?

在《Linux多線程服務端編程》一書5.1節中提到過,在x86-64的Linux上,gettimeofday不是系統調用,不會陷入內核。其實這種說法有點小問題,因爲gettimeofday確實是個系統調用,但是linux的vdso

原创 使用googletest測試可能斷言或導致進程退出的函數

做單元測試,一般是驗證函數輸出數據與預期是否相符。但是也有例外,我們可能需要驗證函數在接收到非法參數時是否會斷言或拋異常,例如下面這個例子: int foo(int *p) { assert(p != nullptr);

原创 linux下監控shell腳本或可執行程序啓動過的子進程

使用history命令可以查看在shell中直接執行過的命令,但是無法查看間接執行過的命令,或者說啓動過的子進程。舉個例子,shell腳本或者make命令都會啓動一些子進程,這些子進程並不會顯示在history命令的輸出中,那麼如

原创 Qt使用OpenGL進行多線程離屏渲染

基於Qt Widgets的Qt程序,控件的刷新默認情況下都是在UI線程中依次進行的,換言之,各個控件的QWidget::paintEvent方法會在UI線程中串行地被調用。如果某個控件的paintEvent非常耗時(等待數據時間+

原创 ptrace系統調用的實現

最近遇到這樣一個問題,機器跑着跑着畫面凍結了,打開top看到Xorg的cpu佔用率100%。想用gdb掛上去看一下,結果gdb一直卡着掛不上去。後來又換用perf分析,結果發現進程99%的時間花在了一個ioctl調用。這個ioctl操

原创 Qt在Linux下如何查找可用字體

最近遇到一個問題:一個Qt程序在Windows上正常運行,在Linux下編譯運行後漢字就全變成方塊了,成了名副其實的“方塊字”。 我一開始考慮是字符編碼問題,調用QChar::unicode檢查中文字符的編碼,發現沒有問題。 如果不是

原创 Qt在Linux下中文變方塊的問題

最近遇到一個問題:一個Qt程序在Windows上正常運行,在Linux下編譯運行後漢字就全變成方塊了,成了名副其實的“方塊字”。 我一開始考慮是字符編碼問題,調用QChar::unicode檢查中文字符的編碼,發現沒有問題。 如果不是

原创 C++11中靜態局部變量初始化的線程安全性

前言 大家都知道,在C++11標準中,要求局部靜態變量初始化具有線程安全性,所以我們可以很容易實現一個線程安全的單例類: class Foo { public: static Foo *getInstance() {

原创 Myer差分算法(Myer's diff algorithm)

Myer差分算法是一個時間複雜度爲O(ND)的diff算法,就以diff兩個字符串爲例,其中N爲兩個字符串長度之和,D爲兩個字符串的差異部分的總長度。這個算法首先發表在An O(ND) Difference Algorithm and

原创 編輯距離算法和Levenshtein距離算法

前言 最近在研究diff工具的實現,已經寫了一個簡單的demo,不過目前這個demo只是把Levenshtein距離算法的結果用Qt可視化了出來而已,還沒有實用價值,界面如下: 各種diff工具的核心基本都是編輯距離算法,網上許多文

原创 C++:shared_ptr與隱式轉換

最近遇到這樣一個編譯問題,代碼是這樣的: #include <memory> #include <iostream> class Base { public: virtual ~Base() {} }; class Der

原创 Linux C/C++調試之二:使用strace追蹤程序系統調用

在之前的一篇文章中,我介紹了一種調試手段:利用LD_PRELOAD機制,攔截動態鏈接器對動態庫的符號解析,達到監控程序IO的目的。事實證明我還是太naive了,我們大可利用現成的工具——strace,來更好地完成這一項工作。 stra

原创 C++的返回值優化(RVO,Return Value Optimization)

前言 大家都知道“過早的優化是萬惡之源”這句話,然而我相信其中的大多數人都不知道自己是不是在做過早的優化。我也無法準確的定義什麼叫做“過早的優化”,但我相信這“過早的優化”要麼是得不償失的,要麼乾脆是有害無利的。今天我就想舉個我認爲是

原创 一次嘗試使用cmu sphinx做語音識別的失敗記錄

好好的C++不去寫,爲啥想起來搞什麼語音識別?事情是這樣的,我經常躺在牀上聽歌,使用電腦連音響播放,因爲我比較懶,切歌啥的都直接召喚小娜幫我做,可以節省體力。然而小娜笨啊,除了能切歌啥也幹不了,我要是聽到一首好聽的,還得爬起來去收藏,

原创 linux下鼠標事件丟失與evdev緩衝區溢出問題

之前遇到這樣一個bug:在一個性能較差的linux平臺上的一個Qt程序,當UI線程在執行耗時操作時,界面會卡頓,而這時頻繁點擊滑動鼠標,會出現鼠標事件丟失的問題。舉個例子:某個控件收到一個鼠標按下的事件,但再也沒有收到鼠標彈起事件,而