本文主要介紹如何使用c++封裝posix 執行緒庫(一)互斥鎖、c++封裝posix 執行緒庫(二)條件變數的封裝和c++封裝posix 執行緒庫(三)執行緒的封裝三文中介紹的posix pthread的基本元件(互斥鎖,條件變數和執行緒)c++封裝的使用。
設計乙個場景讓我們用到這三個元件:一共啟動三個執行緒,其中兩個執行緒負責互斥地對`count「變數進行increment增量操作,另外乙個執行緒則對count變數進行監視,使用條件變數等待其到達某個值時才喚醒修改count的值。
我們封裝了thread類,並設定成員函式run()為純虛函式,因此我們使用類繼承,並重寫run方法:
class inccount : public thread//增加計數執行緒
void run()
//列印資訊方便除錯
std::cout
<<"thread : "
<" count : "
<< count << std::endl;
}//臨界區
sleep(1.5);//注:sleep不是同步原語,這裡只是為了方便除錯}}
};class watchcount: public thread//監視執行緒
void run()
assert(count>=12);
count+=125;
std::cout
<<"thread : "
<" count : "
<< count << std::endl;
}};
用c++封裝pthread元件讓我們很容易想到多型這個特性,當然我們完全可以這樣寫:
int main()
如果用多型的話,可以用vector
來儲存父類指標,並初始化指向子類引用,不過使用vector
我們時常會有困惑,那就是vector作為棧上變數,其程式結束變數生命期結束,而容器中的指標所指向的物件需要我們手動去delete
,這樣就會容易出錯。boost庫中提供shared_ptr(c++11已經加入std),可以避免這種記憶體洩露的錯誤:vector生命期結束,shared_ptr
釋放,物件的引用計數變為0,也就自動釋放資源了。
for(int i=0;i<3;i++)
}//debug
#include "thread.h"
#include "mutexlock.h"
#include "condition.h"
#include
#include
using
namespace
std;
mutexlock mutex;//互斥鎖
condition cond(mutex);//條件變數
int count =0;
class inccount : public thread
void run()
std::cout
<<"thread : "
<" count : "
<< count << std::endl;
}sleep(1.5);}}
};class watchcount: public thread
void run()
assert(count>=12);
count+=125;
std::cout
<<"thread : "
<" count : "
<< count << std::endl;
}};int main()
for(int i=0;i<3;i++)
}return
0;}
#makefile
progs =main
cleanfiles = core core.*
*.core
*.otemp.*
*.out typescript* \
*.lc
*.lh
*.bsdi
*.sparc
*.uw
all :$
cxxflags+=-g -std=c++11
main: main.o thread.o mutexlock.o condition.o
$$ -o $@ $^ -lpthread
@rm*.oclean:
rm -f $
$
1.《linux多執行緒服務端程式設計:使用muduo c++網路庫》
2.
C 封裝POSIX 執行緒庫(一)互斥鎖的封裝
在知乎上有人吐槽說c 11多執行緒庫做的太複雜,建議自己封裝一蛤,只要乙個下午就搞定了。當然我沒有陳碩老師那麼大本事,花了幾天時間,學習了一下把posix pthread進行簡單的封裝。互斥鎖主要用於互斥,互斥是一種競爭關係,用來保護臨界資源一次只被乙個執行緒訪問。posix pthread提供下面...
C 類的使用(三) 封裝
封裝,顧名思義,就是將一些資訊放在一起封存起來,不讓別人訪問 事實上,類的一大特點就是封裝,封裝有利於管理資料,以及記錄運算元據的行為 事例 class class void setx int x intgetx private int x 很顯然,我們可以通過函式void setx int x 來...
C 多執行緒(四) Timer的使用
1.timer 類的作用是設定乙個定時器,定時執行使用者指定的函式,而這個函式的傳遞是靠另外乙個 物件 timercallback 它必須在建立 timer 物件時就指定,並且不能更改。定時器啟動後,系統將自動建立乙個新的執行緒,並且在這個執行緒裡執行使用者指定的函式。2.timer timer n...