『壹』 linux線程的創建、退出、等待、取消、分離
返回值:成功:0,錯誤:出錯編號。
pthread不是Linux系統默認的庫而是POSIX線程庫。在Linux中將其作為一個庫來使用,因此編譯時需要加上-pthread以顯式鏈接該庫
返回線程ID
線程標識符在進程中是唯一的,即分別屬於兩不同進程的兩個線程可能有相同的線程標識符
retval:返回信息
參數表:
thread: 要等待的線程的pid
retval:用來存儲被等待線程的返回值
返回0:成功;返回錯誤號:失敗
主線程阻塞自己,等待子線程結束,然後回收子線程資源
可以設置線程能否被取消和取消後是否立即執行
參數表
state:PTHREAD_CANCEL_DISABLE或者PTHREAD_CANCEL_ENABLE
oldstate:指針類型,上一次取消狀態的指針,可設NULL
type:PTHREAD_CANCEL_ASYNCHRONOUS立即取消
PTHREAD_CANCEL_DEFERRED等待事件(如pthread_join時)才取消
在任何一個時間點上,線程是可結合的(joinable),或者是分離的(detached)。一個可結合的線程能夠被其他線程收回其資源和殺死,只有當pthread_join()函數返回時,創建的線程才算終止,才能釋放自己佔用的系統資源;在被其他線程回收之前,它的存儲器資源(如棧)是不釋放的。相反,一個分離的線程是不能被其他線程回收或殺死的,它的存儲器資源在它終止時由系統自動釋放。 因此為了避免內存泄漏,所有線程的終止,要麼已設為DETACHED,要麼就需要使用pthread_join()來回收
返回0成功,錯誤號失敗
分離後不可以再合並。該操作不可逆
綜合以上要想讓子線程總能完整執行(不會中途退出),
註:很多地方參照了黃茹老師主編的《Linux環境高級程序設計》
『貳』 linux如何進行線程管理
方法一:PS
在ps命令中,「-T」選項可以開啟線程查看。下面的命令列出了由進程號為<pid>的進程創建的所有線程。
1.$ ps -T -p <pid>
「SID」欄表示線程ID,而「CMD」欄則顯示了線程名稱。
方法二: Top
top命令可以實時顯示各個線程情況。要在top輸出中開啟線程查看,請調用top命令的「-H」選項,該選項會列出所有Linux線程。在top運行時,你也可以通過按「H」鍵將線程查看模式切換為開或關。
1.$ top -H
要讓top輸出某個特定進程<pid>並檢查該進程內運行的線程狀況:
$ top -H -p <pid>
『叄』 Linux進程與線程的區別和聯系
什麼是線程?是進程中執行的一條路徑,是系統調度的最小單位。
什麼是進程?是正在運行的程序,是系統分配資源的最小單位。
線程與進程之間有什麼關系?
1.一個進程可以有多個線程,一個線程只能屬於一個進程。
2.同一個進程下的所有線程共享該進程下的所有資源。
3.真正在處理機上運行的是線程,不是進程,線程是進程內的一個執行單元,是進程內的可調度實體。
Linux線程與進程有什麼區別?
進程:
優點:多進程可以同時利用多個CPU,能夠同時進行多個操作。
缺點:耗費資源(創建一個進程重新開辟內存空間)。
進程不是越多越好,一般進程個數等於cpu個數。
線程:
優點:共享內存,尤其是進行IO操作(網路、磁碟)的時候(IO操作很少用cpu),可以使用多線程執行並發操作。
缺點:搶占資源。
『肆』 linux 進程回收線程資源指哪些資源
Linux系統中程序的線程資源是有限的,表現為對於一個程序其能同時運行的線程數是有限的。而默認的條件下,一個線程結束後,其對應的資源不會被釋放,於是,如果在一個程序中,反復建立線程,而線程又默認的退出,則最終線程資源耗盡,進程將不再能建立新的線程。
解決這個問題,有2種方式,系統自動釋放線程資源,或者由另一個線程釋放該線程資源。
注意,在這里,我認為進程運行後,本身,也是一個線程,主線程,主線程和主線程建立的線程共享進程資源。不同於其他線程,在於主線程運行結束後,程序退出,所有程序建立的線程也會退出。
系統自動釋放
如果想在線程結束時,由系統釋放線程資源,則需要設置線程屬性為detach。
代碼上,可以這樣表示:
pthread_t t;
pthread_attr_t a; //線程屬性
pthread_attr_init(&a); //初始化線程屬性
pthread_attr_setdetachstate(&a, PTHREAD_CREATE_DETACHED); //設置線程屬性
::pthread_create( &t, &a, GetAndSaveAuthviewSDRStub, (void*)lp); //建立線程
其他線程釋放
另一種方式,則是由另一個線程將該資源釋放。
代碼上,可以這樣表示:
pthread_t t;
::pthread_create( NULL, NULL, GetAndSaveAuthviewSDRStub, (void*)lp);
::pthread_join( t);
::pthread_join( t)等待線程t退出,並釋放t線程所佔用的資源。當然,這里也有個同步的功能,使一個線程等待另一個線程退出,然後才繼續運行。
linux線程執行和windows不同,pthread有兩種狀態joinable狀態和unjoinable狀態,如果線程是joinable狀態,當線程函數自己返回退出時或pthread_exit時都不會釋放線程所佔用堆棧和線程描述符(總計8K多)。只有當你調用了pthread_join之後這些資源才會被釋放。
若是unjoinable狀態的線程,這些資源在線程函數退出時或pthread_exit時自動會被釋放。
unjoinable屬性可以在pthread_create時指定,或在線程創建後在線程中pthread_detach自己,如:pthread_detach(pthread_self()),將狀態改為unjoinable狀態,確保資源的釋放。或者將線程置為joinable,然後適時調用pthread_join.
在程序運行中檢查/proc/ <pid> /maps文件,若看到大概8K左右的很多虛擬內存碎片,基本上可以確認是線程資源泄漏造成的300個線程後pthread_create失敗。
不知是否因為自己,先對要創建的線程做了以下屬性設定,
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
然後又在線程函數中使用
pthread_detach(pthread_self());
兩段代碼作用有沖突。
===============================================================================
pthread_detach(threadid)和pthread_detach(pthread_self())的區別應該是調用他們的線程不同,沒其他區別。
pthread_detach(threadid)函數的功能是使線程ID為threadid的線程處於分離狀態,一旦線程處於分離狀態,該線程終止時底層資源立即被回收;否則終止子線程的狀態會一直保存(佔用系統資源)直到主線程調用pthread_join(threadid,NULL)獲取線程的退出狀態。
通常是主線程使用pthread_create()創建子線程以後,一般可以調用pthread_detach(threadid)分離剛剛創建的子線程,這里的threadid是指子線程的threadid;如此以來,該子線程止時底層資源立即被回收;
被創建的子線程也可以自己分離自己,子線程調用pthread_detach(pthread_self())就是分離自己,因為pthread_self()這個函數返回的就是自己本身的線程ID。
『伍』 linux多線程
線程是進程內獨立的一條運行路線,處理器調度的最小單元,也可以稱為輕量級進程。線程可以對進程的內存空間和資源進行訪問,並與同一進程中的其他線搏好程共享。因此,線程的上下文切換的開銷比創建圓銀拆進程小很多。
Pthread是一套用戶級線程庫,但在linux上實現時,卻使用了內核級線程來完成,這樣提高的線程的並發性.Pthread是由POSIX提供的橘棗一套通用的線程庫,具有很好的移植性.
『陸』 linux下多進程或者多線程編程的問題。新手,望指教!
你好,多進程或多線程,都不會阻塞當前語句代碼。為了您的理解,我就大膽舉下面兩個例子:
多進程:你可以看成是本來是一條路的,現在從中間拆成兩條,然後每一條路都有屬於自己這條路的代碼在運行。
多線程:你可以看成是一條路,然後分出車道,比如左車道和右車道甚至是停車道,然後每條車道都單獨通車,其他車道的不能對這條車道進行干擾。
所以,把一條路從中間拆成兩條,成本是很高的。但是把一條路分車道,成本就不是很高了。
對於您提出的main函數的疑問,當main函數最後執行完畢,程序退出後,所有的進程包括線程,都會被關閉的,哪怕你的程序中沒有關閉,操作系統也會幫你關閉的,現在的操作系統都非常的完善了。當然,也存在有線程或進程不被釋放的特殊情況,最好在編程中要記得釋放。