上回說道,linux原本無線程概念,在使用者空間的執行緒到核心均是由lwp實現。
下面由具體**描述:
在程序描述符struct task_struct中有字段:
struct list_head children; /* 子程序鍊錶 */
struct list_head sibling; /*兄弟程序鍊錶*/
struct list_head thread_group; /*執行緒組 */
上述字段意義已經由備註寫出,分別是current程序的子程序鍊錶,和其兄弟程序鍊錶,還有我要說的執行緒組鍊錶,在這個thread_group鍊錶中的程序就是由current程序pthread_create出來的一系列執行緒,他們都由lwp來實現,每個lwp都有自己的pid,只是他們的tgid全部都等於current ->pid,也就是等於這個執行緒組領頭程序的程序號。
利用pstree -p 命令可以看出整個系統的程序組織結構,其中如果程序名(current->comm)被所包含,表示其就是lwp,那麼怎樣訪問呢,下面就簡單的闡述下list_head結構,及其在linux裡的組織遍歷方法。在linux中很多資料都是以雙向迴圈鍊錶的形式組織起來的。
list_head結構其實很簡單,就是
struct list_head ;
這和教科書上的定義思想相反,資料結構的書籍一般都寫著是指標域包含資料域,像上面所示,一般會有data,而linux裡的定義是資料域包含指標,即:
struct data
對此,怎樣根據這些list_head找到data呢,linux 為此提供了一些巨集來更好的幫助完成這項工作。
方法1:
struct list_head *i; //游標
struct task_struct *p; //載體
list_for_each(i,&(current->thread_group)) //for迴圈
p=list entry(i,struct task_struct ,thread_group)
方法2:
list_for_each_entry(p, &(current->thread_group), thread_group)
方法2就是將1的兩個步驟合起來罷了,其實還有很多類似的巨集,這裡就不贅述了。
說到這裡,linux中程序執行緒的關係已經基本理清楚了
程序,執行緒池,執行緒
執行緒池的五個狀態 running 可以接受新的任務,也可以處理阻塞佇列裡的任務 shutdown 不能接受新的任務,可以處理阻塞佇列裡的任務,running 狀態下呼叫 shutdown 函式會裝變成 shutdown 狀態stop 不能接受新的任務,也不能處理阻塞佇列裡的任務,running 狀...
程序 執行緒 多執行緒
程序是系統中正在執行的乙個程式,程式一旦執行就是程序。程序可以看成程式執行的乙個例項。程序是系統資源分配的獨立實體,每個程序都擁有獨立的位址空間。乙個程序無法訪問另乙個程序的變數和資料結構,如果想讓乙個程序訪問另乙個程序的資源,需要使用程序間通訊,比如管道,檔案,套接字等。乙個程序可以擁有多個執行緒...
ruby執行緒操作(續)顯示和停止執行緒
可以使用pass方法暫停執行緒,執行其他的執行緒 threadpass1 thread.start do threadpass1.pass endthread.new do end執行結果 使用sleep方法能使程序進入休眠狀態,待時間結束執行緒會sleep狀態變為可執行狀態,還可以使用wakeup...