首先說一下線程的概念.其實就是運行在進程的上下文環境中的一個執行流.普通進程只有一條執行流,但是線程提供了多種執行的路徑並行的局面.
同時,線程還分為核心級線程和用戶級線程.主要區別在屬於核內還是核外.
核心級線程,地位基本和進程相當,由內核調度.也就是說這種系統時間片是按線程來分配的.這種線程的好處就是可以適當的運用SMP,即針對多核CPU進行調度.
用戶級線程,在用戶態來調度.所以相對來說,切換的調度時間相對核心級線程來說要快不少.但是不能針對SMP進行調度.
對於現在的系統來說,純粹的用戶級線程只存在於實驗室中吧.
對於Linux中實現的線程來說,支持LWP(輕量級進程).把用戶級線程映射到內核級上.簡單來說,Linux只有內核級進程,不存在真正的線程.但是我們也可以把LWP叫做線程.
線程和進程對操作系統來說相當於是平行的關系,但大部分資源是隸屬於進程的.如果進程掛了,全部線程也會終止.(直接賦值其進程的頁表,然後修改特殊的部分即可創建一下線程~復習一下虛擬存儲~)
順帶一提erlang虛擬機下的輕量級線程似乎就是用戶級線程.我記得在哪看過,說erlang切換線程比c執行的線程切換還快.這裡erlang的線程概念和用戶級線程概念又不一樣.是erlang虛擬機自己實現的線程,叫做用戶線程.(沒有’級’字,操作系統概念還真是繞啊..).這是由於Linux只有LWP造成的.
這裡我有個疑問,就是Linux的線程是否是環保線程.這個概念也是今天剛看<現代操作系統>中提到的.意思就是對於進程來說,線程並不立即釋放資源,而是等到進程結束再釋放.這樣就省去了線程重新生成的開銷.對於服務器來說應該是很有用的一個策略呢.有知道的嗎?
在Linux中使用線程 http://www.linuxidc.com/Linux/2013-10/91381.htm
Linux中多線程的實現 http://www.linuxidc.com/Linux/2014-03/97467.htm
Linux多線程──生產者消費者 http://www.linuxidc.com/Linux/2012-07/65199.htm
Linux多線程──讀者寫者問題 http://www.linuxidc.com/Linux/2012-07/65198.htm
Linux基礎編程 多線程中的互斥鎖 pthread_mutex_lock http://www.linuxidc.com/Linux/2012-07/65030.htm
Linux基礎編程 多線程同步 pthread_cond_signal http://www.linuxidc.com/Linux/2012-07/65031.htm
--------------------補充說明分割線-----------------------
又看了些書.發現實際上linux的線程創建過程主要調用的是clone函數.
這個函數的第二個參數有好幾種狀態選擇.這些選擇決定了clone出來的進程是一般所說的線程還是一個進程.
並且有以下幾種標志可以選擇:
CLONE_VM 置1:創建線程--共享地址空間 置0:創建進程,不共享地址空間,但會復制
CLONE_FS 共享umask 不共享
CLONE_FILES 共享文件描述符 復制文件描述符
CLONE_SIGHAND 共享信號句柄表 賦值信號句柄表
CLONE_PID 新線程獲得舊的PID 新線程獲得自己的PID
CLONE_PARENT 新線程與調度這有相同的父親 新線程的父親是調用者
Linux對進程標識符PID和任務標識符TID進行了區分!!並且兩個都在task_struct結構中.
當用clone函數創建一個新進程而不需要和舊進程共享任何信息時,PID被設置成一個新值(新進程?fork?).否則任務得到一個新的任務標識符,但是PID不變.
TID也就是我後面會說的線程標識符.
估計pthread庫中,應該就是把這些標志都選上,然後創建的.
----------------------------------------------------------------
使用線程的程序一般具有一下特征:
1.能夠與其他任務並行執行.
2.有可能會被阻塞較長時間,但這時候其他進程可並發執行.
3.需要回應異步事件.畢竟異步本身就是不確定阻塞時間的.
4.線程使用CPU的時間足夠長.不然切換的代價也不少.
這裡要寫的是Pthread線程.也就是POSIX定義的線程接口.這個接口包含100多個函數,所有函數名都已pthread_開頭.功能上大致分為三類:
線程管理: 這類函數負責線程的創建,終止,匯合,取消,以及縣城屬性的設置和查詢等.
線程同步: Pthread提供了互斥變量,條件變量,柵欄(屏障)變量等手段支持線程間的同步.
操作線程專有數據: 多線程程序中,全局數據分為所有線程都可以訪問的共享數據和單個線程內所有函數都可以訪問的線程專有數據.
這裡要注意一點:所有函數都部通過errno來報錯.執行成功均返回0.除開pthread_getspecific完全不報錯之外,其余的返回錯誤號.
但是對於單獨的一個線程,報錯的時候修改你的errno,其他線程是無法干擾的.實際上Linux的errno是一個局部變量(這裡也是網上查的,不過都是很老的帖子裡面的,有錯誤請指正)
線程標識:
pthread_t pthread_self(void); 用於獲得線程ID,即TID
pthread_equal(pthread_t t1,pthread_t t2); 用於比較兩個線程標號,pthread_t可能並不是整形.
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-06/103487p2.htm