第十二章 併發程式設計

2022-09-14 07:36:06 字數 1188 閱讀 6300

構建併發伺服器的方法:在父程序中接收客戶端連線請求,然後建立乙個新的子程序來為每個新客戶端提供服務。

假設現在有兩個客戶端和乙個伺服器,伺服器正在監聽乙個監聽描述符上的連線請求。併發過程如下:

1、伺服器接受客戶端1的連線請求

2、伺服器派生乙個子程序為這個客戶端1服務

3、伺服器接受另乙個客戶端2的連線請求

4、伺服器派生另乙個子程序為新的客戶端2服務

i/o多路復用可以用做併發事件驅動程式的基礎,在事件驅動程式中,某些事件會導致流向前推進,一般的思路是將邏輯流模型化為狀態機。i/o多路復用來顯示的排程這些流。乙個狀態機就是由一組狀態、輸入事件、轉移,其中轉移是將狀態和輸入事件對映到狀態。

使用訊號量來排程共享資源:

訊號量可以用來排程對共享資源的訪問。在這種場景中,乙個執行緒用訊號量操作來通知另乙個執行緒,程式狀態中的某個條件已經為真了。兩個經典的例子是生產者-消費者和讀者-寫者問題。

生產者-消費者問題:生產者產生專案並把它們插入到乙個有限的緩衝區中,消費者從緩衝區中取出這些專案,然後消費它們。

一組併發的執行緒要訪問乙個共享物件,例如乙個主存中的資料結構,有些執行緒唯讀物件,而其他的執行緒只修改物件,修改物件的執行緒叫做寫者,唯讀物件的執行緒叫做讀者。寫者必須擁有對物件的獨佔的訪問,而讀者可以和無限多個其他的讀者共享物件。

讀者-寫者問題分兩種情況:

1、讀者優先。要求不讓讀者等待,除非已經把使用物件的許可權賦予了乙個寫者。讀者不會因為乙個寫者在等待而等待。

2、寫者優先。要求一旦乙個寫者準備好可以寫,它就會盡可能快的完成它的寫操作。

這兩種讀者-寫者問題可能導致飢餓,飢餓是指乙個執行緒無期限的阻塞,無法進展。例如,如果有讀者不斷地到達,寫者就可能無限地等待。

執行緒安全

當乙個函式被多個執行緒反覆地呼叫時,它會一直產生正確的結果,這個函式是執行緒安全的。反之,該函式是執行緒不安全的。

四個執行緒不安全函式類:

1、不保護共享變數的函式

2、保持跨越多個呼叫的狀態的函式

3、返回指向靜態變數的指標的函式

4、呼叫執行緒不安全函式的函式

執行緒安全函式:

可重入函式:當它們被多個執行緒呼叫時,不會引用任何共享資料。

死鎖:一組執行緒被阻塞了,等待乙個永遠不可能為真的條件。

規避死鎖:

給定所有互斥操作的乙個全序,如果每個執行緒都是以一種順序獲得互斥鎖並以相反的順序釋放,那麼這個程式就是無死鎖的。

第十二章 併發程式設計

1 併發 邏輯控制流在時間上重疊 2 併發程式 使用應用級併發的應用程式稱為併發程式。3 三種基本的構造併發程式的方法 1 需要乙個sigchld處理程式,來 僵死子程序的資源。2 父子程序必須關閉各自的connfd拷貝。對父程序尤為重要,以避免儲存器洩露。3 套接字的檔案表表項中的引用計數,直到父...

Objective C 程式設計 第十二章

預處理程式語句使用 開頭,一行中的第乙個非空字元。大部分內容都與c語言類似,相當於複習啦。預定義不是變數。不能為它賦值。實際上是字元的簡單替換。define語句常放在 import或 include語句後邊。定義乙個名稱後,可以在任何地方使用。一般放在標頭檔案,方便在多個原始檔中使用。所有預定義的名...

CSAPP讀書日記 第十二章 併發程式設計

構造併發程式的方法 構造併發程式最簡單的方法就是用程序,使用像fork exec和waitpid之類的函式。特點 父子程序之間共享檔案表,但是不共享使用者位址空間。優點 乙個程序不會覆蓋另乙個程序的虛擬記憶體。缺點 程序共享狀態資訊變得困難,必須使用顯式的ipc 程序間通訊 機制。結果就是這種設計方...