程序同步三個常見問題

2021-10-04 22:45:11 字數 1138 閱讀 9491

生產者-消費者(三個訊號量)

empty:緩衝區 空閒 資源數,full:緩衝區 已滿 資源數 : 保證不會空時消費,滿時生產(保證順序、同步)

mutex 代表互斥鎖 : 保證同一時間只有乙個執行緒可以訪問共享資源(互斥訪問)

producer 

}consumer

}

不能將執行緒裡兩個wait的交換順序,否則會出現死鎖。例如(調換後),將consumer的兩個wait調換,在producer發出signal訊號後,如果producer執行緒此時再次獲得執行機會,執行完了wait(space),此時,另乙個consumer執行緒獲得執行機會,執行了 wait(mutex) ,如果此時緩衝區為空,那麼consumer將會阻塞在wait(items),而producer也會因為無法獲得鎖的所有權所以阻塞在wait(mutex),這樣兩個執行緒都在阻塞,也就造成了死鎖。

滿足條件,才能獲得鎖。

如果consumer先將mutex減1,然後緩衝區已空,將阻塞。producter試圖訪問緩衝區,但mutex為0,阻塞。將無限等待造成死鎖。

讀者-寫者問題 (可以多個程序同時讀,但是寫時就只能有乙個寫)

wmutex: 互斥的寫 (寫時不能讀,只能乙個寫)

rmutex: 互斥的使用readcount(對readcount加鎖)

readcount: 統計讀程序數目,及讀者數量(臨界資源,多個讀程序共享)

reader()

readcount++;

signal(rmutex); //釋放readcount使用權

// 讀的過程

wait(rmutex);

readcount--;

if(readcount == 0) //如果這是最後乙個讀者了,完成了

signal(rmutex);

}}void writer()

}

哲學家進餐問題 : 只允許同時拿起左右兩邊的筷子

mutex: 互斥量,對拿起左右兩隻筷子加鎖(只有乙個程序能訪問)

while(true)

程序同步的三個經典問題

要求 producer和consumer,二者不能對buffer進行操作 當buffer滿的時候,就不允許producer繼續寫 當buffer空的時候,就不允許consumer繼續讀 訊號量及其初始化 semaphore mutex 1 buffer的鎖 semapore full 0 滿位的數量...

程序同步問題

有讀者和寫者兩組併發程序,共享乙個檔案,當兩個或以上的讀程序同時訪問共享資料時不會產生 但若某個寫程序和其他程序 讀程序或寫程序 同時訪問共享資料時則可能導致資料不一致的錯誤。因此要求 允許多個讀者可以同時對檔案執行讀操作 只允許乙個寫者往檔案中寫資訊 任一寫者在完成寫操作之前不允許其他讀者或寫者工...

人際交往三個常見問題

人際交往是什麼?人際交往也被稱 為人際溝通 是指個體通過一定的文字 語言或表情 肢體動作等表達手段將某種資訊傳遞給其他個體的過程 良好的人際交往有什麼作用?1 人際關係好的人很少得心理疾病,例如抑鬱 焦躁 沉悶等等,因為這些人善於交談,開朗,有什麼心裡話都能說出來,不憋在心理,這樣有利於身心健康的發...