linux之多執行緒

2021-07-03 08:22:20 字數 1872 閱讀 9522

linux系統下的多執行緒遵循posix執行緒介面,稱為pthread;

標頭檔案:  #include

原型:int pthread_create(pthread_t *tidp, const pthread_attr_t *attr,(void *)(*start_rtn)(void*),void *arg);

返回值:若執行緒建立成功,則返回0,若執行緒建立失敗,則返回出錯編號,並且*thread中的內容是未定義的。

返回成功時,由tidp指向的記憶體單元被設定為新建立的執行緒id,attr引數用於指定各種不同的執行緒屬性,

新建立的執行緒從start_rtn函式的位址開始執行,該函式只有乙個萬能指標引數arg,如果需要向start_rtn函式傳遞的引數不止1個,那麼需要把這些引數放到乙個結構中,然後把結構位址作為arg的引數傳入;

引數定義:

第乙個引數 tidp:指向執行緒識別符號的指標;

第二個引數attr:用來設定執行緒的屬性;

第三個引數start_rtn:是執行緒執行的函式的起始位址;

第四個引數arg:是執行函式的引數;

yuv資料進行h.264編碼的執行緒建立:

// creat video encoder loop thread

iret = pthread_create(&(ptencoderinfo->ptthreadid), null,

vencencoder_loop,

(handle)ptencoderinfo);

執行緒就從vencencoder_loop函式處開始執行;

因為pthread並非linux系統的預設庫,而是posix執行緒庫,在linux中作為乙個庫來使用,因此加上-lphread以顯式的鏈結該靜態庫;

pthread_join函式

函式簡介

函式pthread_join用來等待乙個執行緒的結束。

函式原型為:

extern int pthread_join __p (pthread_t __th, void **__thread_return);

引數:第乙個引數為被等待的執行緒識別符號,

第二個引數為乙個使用者定義的指標,

它可以用來儲存被等待執行緒的返回值。這個函式是乙個執行緒阻塞的函式,

呼叫它的函式將一直等待到被等待的執行緒結束為止,當函式返回時,被等待執行緒的資源被收回。

如果執行成功,將返回0,如果失敗則返回乙個錯誤號。

由於呼叫pthread_join後,如果該執行緒沒有執行結束,呼叫者會被阻塞,在有些情況下我們並不希望如此。例如,在web伺服器中當主線程為每個新來的連線請求建立乙個子執行緒進行處理的時候,主線程並不希望因為呼叫pthread_join而阻塞(因為還要繼續處理之後到來的連線請求),這時可以在子執行緒中加入**

pthread_detach(pthread_self())

如果乙個執行緒結束,但是沒有呼叫join,則類似於乙個zombie process,即還有一部分資源沒有被**;所以一般建立執行緒之後都要pthread_join,獲得退出碼,釋放資源,

在這個usb camera裡面主要有2個程序,乙個venc,乙個uvccam;

venc下有4個執行緒:venc_master;venc_vdeoin,venc_motion,venc_encoder;

uvccam的工作主要接收從venc**過來的uvc控制資料並**給雲台主控;

程序的管理,操作要方便一點,從程式的整體健壯性,穩定性考慮,肯定單獨開乙個程序比較好一點;

執行緒的資源開銷占用是比較小的;

uvccam的任務並不是很重,而且venc已經有4個執行緒在執行,如果再加執行緒的話,排程的效率則會降低;

而uvccam只需要讀取佇列然後將uvc控制資料通過串列埠轉給mcu即可,所以單獨開乙個程序或許更合適一點;

Linux之多執行緒

二 執行緒控制 三 執行緒安全 1 多執行緒優點 執行緒的建立與銷毀成本更低。執行緒的切換排程成本更低。程序間切換時不僅僅要切換程序pcb資訊,還有頁表之類的。2 多執行緒缺點 執行緒將自己的入口函式執行完畢後return退出,main中return退出的是程序 執行緒可以呼叫pthread exi...

Linux 之多執行緒程式設計基礎

多執行緒程式設計時有以下幾點需要特別關注 建立執行緒時,僅僅申請執行緒自身的棧空間,與同程序的其他執行緒共享其他位址空間,包括 段 資料段 堆等。核心仍然把執行緒當做乙個程序進行處理的,只不過不再分配記憶體而已 程序是作業系統管理資源的基本單元,執行緒時linux系統排程的基本單元 1 建立執行緒 ...

Boost之多執行緒

c 標準庫沒有涉及執行緒,在c 中,雖然不可能寫出標準相容的多執行緒程式,程式設計師可以使用特定作業系統提供的執行緒庫來寫出多執行緒程式來。可是,這至 少導致兩個突出的問題 作業系統普遍提供的是c庫,在c 中使用要更小心,每個作業系統都有自己的一套支援多執行緒的庫 另外,不標準,不可移植。boost...