讀寫鎖及死鎖

2021-08-19 16:31:34 字數 1633 閱讀 1700

一、讀寫鎖

有些公共資料修改的機會很少,但其讀的機會很多。並且在讀的過程中會伴隨著查詢,給這種**加鎖會降低我們的程式效率。讀寫鎖可以解決這個問題。

讀寫鎖本質上是一種自旋鎖

讀者——寫者:同步與互斥

寫者——寫者:互斥

讀者——讀者:共享、沒關係

面試題:為什麼消費者與消費者之間是互斥而讀者與讀者之間是沒關係?

因為消費者會將資料拿走,而讀者只訪問不會將資料拿走

注意:寫獨佔,讀共享,寫鎖優先順序高

讀寫鎖的策略:讀者優先

寫者優先

初始化

讀寫鎖的屬性一般設定為空

銷毀加鎖和解鎖

6 int counter;//計數器

7 pthread_rwlock_t rwlock;//讀寫鎖

8 9 void* route_write(void *arg)

10 19 }

20 21 void* route_read(void *arg)

22 30 }

31 32 int main()

33 45 for(i = 3;i < 8;i++)//建立5個讀者執行緒

二、死鎖

死鎖是指多個執行緒因競爭資源而造成的僵局(互相等待)

1、產生死鎖的4個條件:

a、互斥:某資源只能被乙個程序使用,其他程序請求該資源時,只能等待,直到該資源被使用完畢

b、請求和保持條件:程式已經保持了至少乙個資源,但是又提出了新要求,而這個資源被其他程序占用,自己占用的資源卻保持不放

c、不可搶占條件:程序已獲得的資源沒有使用完,不能被搶占

d、迴圈等待條件:必然存在乙個迴圈鏈

2、處理死鎖的方法:

a、預防死鎖:破壞死鎖的四個必要條件中的任何乙個或多個

b、避免死鎖:和預防死鎖的區別是,在資源動態分配過程中,用某種方式防止系統進入不安全的狀態

c、檢測死鎖:執行時出現死鎖,能及時發現死鎖,把程式解脫

d、解除死鎖:發生死鎖後,解脫程序,通常撤銷程序,**資源,再分配給正處於阻塞狀態的程序

3、預防死鎖的方法:

a、破壞請求和保持條件

b、破壞不可搶占條件

c、破壞迴圈等待條件

4、避免死鎖的方法:

a、加鎖順序

b、加鎖時限

c、死鎖檢測

互斥鎖遞迴鎖及死鎖現象

from threading import lock,rlock lock 互斥鎖 效率高 rlock 遞迴 recursion 鎖 效率相對低 l lock l.acquire print 希望被鎖住的 l.release rl rlock 在同乙個執行緒中可以被acquire多次 rl.acqu...

鎖 互斥鎖,死鎖

當多個執行緒幾乎同時修改某乙個共享資料的時候,需要進行同步控制 執行緒同步能夠保證多個執行緒安全訪問競爭資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入乙個狀態 鎖定 非鎖定 某個執行緒要更改共享資料時,先將其鎖定,此時資源的狀態為 鎖定 其他執行緒不能更改 直到該執行緒釋放資源,將資源的狀態變...

事務及併發控制(鎖,死鎖,恢復)

標籤 事務 sql併發控制 死鎖資料庫恢復 2016年04月01日 20 38 29 1540人閱讀收藏 舉報資料庫 2 目錄 1.事務 transaction 的定義 指訪問並可能更新資料庫中各種資料項的乙個程式執行單元 unit 包括 sql語句的集合,儲存過程體,高階語言的事件 2.事務的狀態...