作業系統同步演算法(三)

2021-09-01 13:58:42 字數 760 閱讀 5062

實際上,作業系統裡出了互斥鎖,還提供了訊號量來實現併發情況下的同步。

/****讀寫互斥問題

**讀的時候不能寫,寫的時候不能讀

**讀寫交替(使用訊號量)

**/#include

#include

#include

//宣告一把互斥鎖

pthread_mutex_t mutex;

sem_t sem;

void writer(void)

}void reader(void) }

int main(void)

這裡我們通過引入訊號量(sem_t )型別的變數來解決共享緩衝區判斷問題,這裡要注意的乙個地方是pv操作的位置以及互斥鎖的加鎖和訊號量的pv操作順序問題。

首先討論一下pv操作的位置。p在我們的程式中就是sem_post()函式,作用是對訊號量進行加1,這裡很顯然我們應該將p操作放在寫者的執行緒中。同理,讀者中的sem_wait()函式代表的就是v操作,作用是對訊號量進行減1,很顯然應該放在讀者執行緒中。

關於pv操作和加鎖的先後順序。我最開始是先加鎖,再進行p或者v,但是執行的時候我發現程式完全阻塞了,沒有任何輸出,分析了一下原因:如果是讀者先加鎖,加鎖成功,然後進行v操作,這個時候因為訊號量初始值為0,所以進入阻塞。我們再來看寫者會是什麼情況,寫者試圖加鎖,因為讀者已經加鎖了,所以阻塞。至此,兩個執行緒全部阻塞。。。所以要注意,一定是先p或者v操作,再進行加鎖,否則會造成全部阻塞的死鎖現象。

作業系統 程序同步(三)

程序同步中很著名的問題就是生產者 消費者問題,描述如下 有一群生產者程序在生產產品,並將這些產品提供給消費者程序去消費。為使生產者程序與消費者程序能併發執行,在兩者之間設定了乙個具有 n 個緩衝區的緩衝池,生產者程序將它所生產的產品放入乙個緩衝區中 消費者程序可從乙個緩衝區中取走產品去消費。儘管所有...

作業系統 執行緒同步

執行緒同步是為了多執行緒能夠安全訪問共享資源。臨界區 互斥量 事件 訊號量四種方式 臨界區 critical section 互斥量 mutex 訊號量 semaphore 事件 event 的區別 1 臨界區 通過對多執行緒的序列化來訪問公共資源或一段 速度快,適合控制資料訪問。在任意時刻只允許乙...

作業系統 執行緒同步

程序中線程同步的四種常用方式 臨界區 ccriticalsection 當多個執行緒訪問乙個獨占性共享資源時,可以使用臨界區物件。擁有臨界區物件的執行緒可以訪問被保護的資源或 段,其他執行緒若想訪問,則被掛起,直到擁有臨界區的執行緒釋放臨界區為止。定義臨界區物件ccriticalsection g ...