程序: 乙個正在執行的程式,它是資源分配的最小單位
執行緒:是程式執行的最小單位,可以理解為程序的乙個實體。乙個程序可以有多個執行緒。執行緒不能離開程序單獨存在,離開程序談執行緒是沒有意義的。
多執行緒的相比多程序的優勢:
建立子程序是拷貝父程序所有的資源進行併發處理,這樣需要更多的資源消耗,對硬體要求更高。而多程序是子程序共享父程序的資源,並不是完全的拷貝複製父程序的資源。
子程序往父程序返回比較難以實現。
子執行緒的建立比子程序的建立要快10到100倍。
執行緒的共享資源:
全域性變數
程序指令
大多數資料
開啟的檔案(描述符)
訊號處理函式和訊號設定
當前工作目錄
使用者id和組id
執行緒的非共享,每個執行緒各自的資源:
執行緒·id
暫存器集合,包括程式計數器和棧指標
棧(用於存放區域性變數和返回位址)
errno
訊號掩碼
優先順序標頭檔案
#include
編譯
加上 -lpthread
pthread_create函式
int
pthread_create
(pthread * tid,
const pthread_attr_t *attr,
void*(
*func)
(void*)
,void
*arg)
;//建立新執行緒,返回0表示建立成功
引數1: 執行緒的id指標, 每個執行緒都有乙個執行緒id(型別為pthread_t),如果新執行緒建立成功其id就通t過tid返回。
引數2:執行緒屬性引數。執行緒有優先順序、初始棧大小等多種屬性,可以通過pthread_attr_t型別變數進行設定。預設是null.
引數3:新執行緒開始的函式名,函式型別必須是void *。
引數4:新執行緒開始函式的引數,型別為void * , 引數可以傳遞單個變數的指標,也可以傳遞結構體等指標。
pthread_join函式
int
pthread_join
(pthread_t * tid,
void
** status)
;//連線乙個執行緒等待它退出,返回0表示成功
第乙個引數是程序號,第二個引數是來自所等待執行緒的返回值,預設為null。
pthread_self函式
pthread_self
(void);
//返回自身的執行緒號
pthread_detach函式
int
pthread_detach
(pthread_t tid)
;//是執行緒狀態為可分離的,執行緒結束後自己釋放
乙個執行緒是可匯合的(joinable)或者可分離的(detached),如果是可匯合的(預設狀態是),當執行緒結束後不會自己釋放,執行緒id和狀態任會保留,只有當其他執行緒使用pthread_join函式連線它時才能釋放。而如果執行緒狀態是可分離的,當執行緒執行結束後它會自己釋放。
pthread_exit函式
void
pthread_exit
(void
* status)
;//主動終止執行緒
在主函式中呼叫pthread_exit函式可以使父程序等其所有子執行緒都結束後再結束退出,避免父程序提前退出。
父程序、主線程和其他執行緒:
進入主函式時,系統會自己建立父程序和主線程,主線程在main函式返回時會使得父程序結束,而如果父程序結束那麼程序中所有的執行緒都會結束(如果有其他子執行緒沒有執行完就會提前終止)。所以要保證主線程等所有其他子程序結束後再退出返回,可以通過sleep()函式或者pthread_exit()函式實現。
Linux多執行緒基礎之執行緒基礎用法
多人砌牆的故事 加快任務完成可以通過加人的方法來實現。同樣,程式中可以通過加程序來實現,但是,多程序存在資源浪費的問題。而執行緒沒有資源浪費的問題。總結 執行緒就是 輕量級 的程序 執行緒與建立它的程序共享 段 資料段 執行緒有自己的棧 建立執行緒 int pthread create pthrea...
linux 多執行緒基礎4
六 執行緒的作用域 函式pthread attr setscope和pthread attr getscope分別用來設定和得到執行緒的作用域,這兩個函式的定義如下 7 名稱 pthread attr setscope pthread attr getscope 功能 獲得 設定執行緒的作用域 標頭...
多執行緒基礎
對於多執行緒程式設計,很多人概念不清,寫 的時候要麼是處處加鎖,影響效能不說,還容易莫名其妙的死鎖,還有人對多執行緒敬而遠之。所以學習多執行緒程式設計最重要的不是學習 api,而是理解什麼才是多執行緒安全的 從例子說起 include include long global1 0 volatile ...