多執行緒 學習11

2022-05-18 10:38:18 字數 3189 閱讀 3849

以下內容來自:

上面的文章講解了在windows系統下實現多執行緒同步互斥的方法,為了提高在實際問題中分析和思考多個執行緒之間同步互斥問題的能力,接下來將講解pv操作,這也是作業系統中的重點和難點。本文將會先簡要介紹下pv操作的**和基本使用方法,然後再通過兩道經典的計算機考研真題——放水果和安全島來示範如何運用pv操作。

先講講pv操作的起源和用法。

2023年,荷蘭學者dijksrta在參與x8計算機的開發中設計並實現了具有多道程式執行能力的作業系統——the multiprogramming system。為了解決這個作業系統中程序(執行緒)的同步與互斥問題,他巧妙地利用火車執行控制系統中的「訊號燈」(semaphore,或叫「訊號量」)概念加以解決。訊號量的值大於0時,表示當前可用資源的數量;當它的值小於0時,其絕對值表示等待使用該資源的程序個數。注意,這個訊號量的值僅能由pv操作來改變。

pv操作由p操作原語和v操作原語組成(原語也叫原子操作atomic operation,是不可中斷的過程),對訊號量(注意不要和windows中的訊號量機制相混淆)進行操作,具體定義如下:

p(s):

①將訊號量s的值減1,即s=s-1;

②如果s>=0,則該程序繼續執行;否則該程序置為等待狀態。

v(s):

①將訊號量s的值加1,即s=s+1;

②該程序繼續執行;如果該訊號的等待佇列中有等待程序就喚醒一等待程序。

用pv操作實現多執行緒的同步與互斥是非常簡單的,只要考慮邏輯處理上合理嚴密而不用考慮具體技術細節,因此與寫偽**較為相似。比如有多個程序p1、p2、 ……pn。它們要互斥的訪問乙個資源。用pv操作來實現就非常方便直觀。下面是pv操作**:

設定訊號量為s,初值為1。各程序的操作流程如下:

程序p1              程序p2           ……          程序pn

p(s);              p(s);                           p(s);

訪問資源;         訪問資源;                      訪問資源;

v(s);             v(s);                          v(s);

接下來就來幾道簡單的計算機考研真題。

第一題 放水果 南京大學計算機考研真題

桌上有一空盤,允許存放乙隻水果。爸爸可向盤中放蘋果,也可向盤中放桔子,兒子專等吃盤中的桔子,女兒專等吃盤中的蘋果。規定當盤空時一次只能放乙隻水果供吃者取用,請用p、v原語實現爸爸、兒子、女兒三個併發程序的同步。

這個題目涉及的東西非常之多,光人物就有三個再加水果,盤子等等,確實讓人感覺好像無從下手。但不管題目如何變,只要牢牢的抓住同步和互斥來分析問題就必定能迎刃而解。

下面先考慮同步情況即所有「等待」情況:

第一.爸爸要等待盤子為空。

第二.兒子要等待盤中水果是桔子。

第三.女兒要等待盤中水果是蘋果。

接下來來考慮要互斥處理的資源,看起來盤子好像是要作互斥處理的,但由於題目中的爸爸、兒子、女兒均只有乙個,並且他們訪問盤子的條件都不一樣,所以他們根本不會同時去訪問盤子,因此盤子也就不用作互斥處理了。分析至些,這個題目已經沒有難度了,下面用pv原語給出答案:

1.爸爸

p(emptydish)

if (rand()%2==0)

else

2.兒子

p(orange)

取桔子v(emptydish)

3.女兒

取蘋果v(emptydish)

第二題 安全島 南開大學考研真題

在南開大學至天津大學間有一條彎曲的路,每次只允許一輛自行車通過,但中間有小的安全島m(同時允許兩輛車),可供兩輛車在已進入兩端小車錯車,設計演算法並使用p,v實現。

這個問題應該如何考慮了?同樣只要牢牢的抓住同步和互斥來分析問題就必定能迎刃而解。

考慮所有「等待」情況:

在路口n準備從n到t的人應該什麼時候進入了?如果他只判斷道路k上有沒有人肯定是不行的,因為如果安全島m上已經有2個人,那麼路口n和路口t再各進一人,肯定會造成死鎖。因此可以這樣——在路口n準備從n到t的人要等待與他同方向的人已經到達t,如果此人已經到達t,且道路k上沒有人,他必定可以上路了。同理在路口t準備從t到n的人也應該這樣做。

再考慮互斥情況:

路上每次只允許一輛自行車通過,所以道路是需要作互斥處理的。

分析之後,下面就用pv原語給出答案(考研輔導書上的答案):

設定訊號量nt表示在路口n且從n到t方向上允許出發的自行車數量,初值為1。訊號量tn表示在路口t且從t到n方向上允許出發的自行車數量,初值為1。訊號量k和l表示道路,初值均為1。這樣從n到t的車和從t到n的車的行駛流程如下:

從n到t的車                     從t到n的車

p(nt)                p(tn)

p(k)                 p(l)

由n到m               由t到m

v(k)                 v(l)

p(l)                 p(k)

由m到t               由m到t

v(l)                 v(k)

v(nt)                v(tn)

這個題目的解法有很多,比如還可以用訊號量m來記錄安全島m上空位個數,初值為2。每個進入道路前的人都要先預訂安全島上的空位,訂到後再互斥的進入道路。否則就要等待安全島上有空位。訊號量k和l表示道路,初值均為1。然後從n到t的車和從t到n的車的行駛流程如下:

從n到t的車                     從t到n的車

p(m)                 p(m)

p(k)                 p(l)

由n到m               由t到m

v(k)                 v(l)

p(l)                 p(k)

v(m)                 v(m)

由m到t               由m到t

v(l)                 v(k)

這種解決方法也是不會造成死鎖的。安全島的解法非常之多,網上還有不少不同的解法,有興趣的童鞋可以搜尋一下。

11執行緒 多執行緒模型

一 什麼是執行緒 為什麼要引入執行緒 二 引入執行緒機制後的變化 三 執行緒有的屬性 四 執行緒的實現方式 五 多執行緒模型 1 執行緒引入原因分析 2 執行緒 可以把執行緒理解為輕量級程序。執行緒是基本的cpu執行單元,也是程式執行流的最小單元。引入執行緒後不僅程序可以併發,程序內的執行緒也可以併...

多執行緒11 停止執行緒

1 new thread t new thread 執行緒物件一旦建立就進入到新生狀態 2 當呼叫start 方法,執行緒立即進入就緒狀態,但不意味著立即排程執行 3 排程,進入執行狀態,執行緒才真正執行執行緒體的 塊 4 dead,執行緒中斷或者結束,一旦進入死亡狀態,就不能再次啟動 5 阻塞狀態...

C 11多執行緒 mutex學習

一頭檔案內容簡介 classes 1.1 mutexes mutex mutexclass class recursive mutex recursivemutex class class time mutex timedmutex class class recursive timed mutex...