參考
在如圖中所示的程式中,while語句是乙個無限迴圈; 換句話說,一旦執行緒離開臨界區,它就會迴圈到頂部並嘗試再次獲取互斥鎖。
想象一下,執行緒a獲取互斥鎖,執行緒b和c等待。 當a離開時,b進入,但在b離開之前,a迴圈回來加入到佇列中和c一起排隊. b離開時,無法保證c接下來會執行。 實際上,如果接下來是a,並且b加入佇列,那麼我們將回到起始點,可以永遠重複該迴圈。 c餓死。
這種模式的存在證明了互斥體容易受到餓死的影響。
解決方案:
使用兩個十字轉門在臨界區之前建立兩個等候室。 該機制分兩個階段進行。 在第一階段期間,第乙個旋轉門開啟而第二個旋轉門關閉,因此執行緒在第二個房間中積聚。 在第二階段,第乙個旋轉門關閉,因此沒有新執行緒可以進入,第二個旋轉門開啟,因此現有執行緒可以到達臨界區。
雖然等候室中可能有任意數量的執行緒,但這裡的每個執行緒都確保在未來的其他執行緒到達之前進入臨界區。
初始化:
room1和room2跟蹤等候室中的執行緒數。 mutex有助於保護計數器。 t1和t2是十字轉門。
ossemaphoreid_t sem_t1;
sem_t1 =
ossemaphorenew(1
,1,null);
/*t1旋轉門初始化開啟*/
ossemaphoreid_t sem_t2;
sem_t2 =
ossemaphorenew(1
,0,null);
/*t2旋轉門初始化關閉*/
ossemaphoreid_t sem_mutex;
sem_mutex =
ossemaphorenew(1
,1,null);
int room1 =0;
int room2 =
0;
執行緒:
在進入臨界區之前,執行緒必須通過兩個十字轉門。這些十字轉門將**劃分為三個「房間」。 第28行是1號房間,第618行是2號線,其餘的是3號房間。不嚴格地說,計數器room1和room2跟蹤每個房間的執行緒數。
計數器room1以通常的方式受互斥鎖mutex保護,但是room2的保護任務分配在t1和t2中。同樣,對臨界區進行獨佔訪問的責任包括t1和t2這兩個訊號量。為了進入臨界區,執行緒必須持有其中的乙個,但不能同時持有兩個。然後,在退出之前,它會放棄它所持有的任何乙個。
while(1
)ossemaphorerelease
(sem_mutex)
;osdelay(10
);/*等待別的執行緒進入房間*/
ossemaphoreacquire
(sem_t1, oswaitforever)
;/*關閉t1*/
else
}ossemaphoreacquire
(sem_t2, oswaitforever)
;/*關閉t2*/
else
}}
三七互娛 遊戲運維崗筆試題(無答案)
1 簡述tcp ip三次握手和四次揮手過程 2 磁碟分割槽空間還充足,但使用者無法寫入了,簡述可能的原因 3 把列表 1,3,5,7,9 倒序並將元素變為字元型別,請寫出多種方法 4 使用grant賦予user test賬戶從12.12.12.1對db test的select許可權並設定密碼user...