天天看點

程序與線程 thread (二)——線程概念為什麼線程會有用以及如何使用它們 經典的線程模型

為什麼線程會有用以及如何使用它們

人們需要線程的主要原因:

1、在許多應用中同時發生着多種活動。其中某些活動随着時間的推移會阻塞。通過将這些應用程式分解成可以準并行運作的多個順序線程,程式設計模型會變得更簡單。

2、線程比程序更輕量級,是以他們比程序更容易建立,也更容易撤銷。

3、若多線程都是CPU密集型的,那麼并不能獲得性能上的增強,但是如果存在着大量的計算和大量的I/O處理,擁有多線程允許這些活動彼此重疊進行,進而會加快應用程式執行的速度。

線程模型

并行實體擁有共享同一個位址空間和所有可用資料的能力。

構造伺服器的三種方法

模型 特性
多線程 并行性、阻塞系統調用
單線程程序 無并行性、阻塞系統調用
有限狀态機 并行性、非阻塞梓潼調用、中斷

每次伺服器從為某個請求工作的狀态切換到另一個狀态時,都必須顯示的儲存或重新裝入相應的計算狀态。我們以一種困難的方式模拟了線程及其堆棧。每個計算都有一個被儲存的狀态,存在一個會發生且使得相關狀态發生改變的事件集合,我們把這類設計稱為有限狀态機。

多線程處理及大量資料的應用的例子

有關的程序可以用一個輸入線程、一個處理線程和一個輸出線程組成。輸入線程把資料讀入到輸入緩沖區中;處理線程從輸入緩沖區中取出資料,處理資料,并把結果放在輸出緩沖區中;輸出線程把這些結果寫到磁盤上。

經典的線程模型

程序模型基于兩種獨立的概念:資源分組處理與執行。

了解程序的角度

1、程序用某種方法把相關資源集中在一起。程序有存放程式正文和資料以及其他資源的位址空間。

2、程序擁有一個執行的線程,通常簡寫為線程。線程中有一個計數器,用來記錄接着要執行哪一條指令。線程擁有寄存器,用來儲存線程目前的工作變量。線程還有一個堆棧,用來記錄執行曆史。

程序用于把資源集中到一起,而線程則是在CPU上被排程執行的實體。

所有的線程都有完全一樣的位址空間,他們共享一樣的全局變量。由于各個線程都可以程序位址空間中的每一個記憶體位址,是以一個線程可讀可寫甚至可清除另一個線程的堆棧,

程序中的内容 線程中的内容

位址空間

全局變量

子程序

即将發生的定時器

信号與信号處理程式

賬戶資訊

程式計數器

寄存器

堆棧

狀态

為什麼每個線程擁有自己的堆棧?

每個線程的堆棧有一幀,供各個被調用但是還沒有從中傳回的過程使用。該堆棧中存放了響應過程的局部變量以及過程調用完成之後使用的傳回位址。每個線程會調用不同的過程,進而有一個各自不同的執行曆史。

建立線程通常會傳回一個線程辨別符,該辨別符是線程的名字。

建立線程 pthread_create
退出線程 pthread_exit
等待其他線程終止 pthread_join
允許線程讓出CPU給出其他線程 pthread_yied
建立并初始化一個線程 pthread_attr_init
删除一個線程的屬性結構 pthread_attr_destory

新建立的線程的線程辨別符會被所謂函數值傳回。

繼續閱讀