C 封裝POSIX 執行緒庫(四)使用封裝的執行緒

2021-07-15 15:58:16 字數 2351 閱讀 3969

本文主要介紹如何使用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...