讀寫鎖 特性 介面及常見問題分析

2021-10-03 11:34:58 字數 1071 閱讀 2652

適用的場景

少量寫的執行緒 + 大量讀的執行緒

讀寫鎖和互斥鎖很相似,但是讀寫鎖允許讀的並行

讀寫鎖的三種狀態

讀模式的加鎖狀態

寫模式的加鎖狀態

不加鎖的狀態

加鎖規則

一次只有乙個執行緒可以占有寫模式的讀寫鎖,不能同時寫,但能同時讀,即乙個執行流進行寫的時候,其他執行流既不能寫也不能讀,乙個執行流進行讀的時候,其他執行流可以讀,但是不能寫

多個執行緒可以同時去占有讀模式的讀寫鎖,在讀寫鎖的內部實現了乙個引用計數,每開啟乙個讀模式的讀寫鎖,引用計數進行加 1 操作,當讀寫鎖進行釋放的時候,會對引用計數進行減 1 操作,直到引用計數完全減為 0,則表示讀模式的讀寫鎖就解鎖了 定義

pthread_rwlock_t

初始化pthread_rwlock_init(pthread_rwlock_t*, pthread_rwlockattr_t*)

加鎖pthread_rwlock_rdlock(pthread_rwlock_t*)//讀模式開啟

pthread_rwlock_wtlock(pthread_rwlock_t*)//寫模式開啟

解鎖pthread_rwlock_unlock(pthread_rwlock_t*)

銷毀pthread_rwlock_destroy(pthread_rwlock_t*)

問題:

如果有多個執行緒同時以讀的方式獲取讀寫鎖,在此之後,有乙個執行緒想要以寫的方式獲取讀寫鎖,讀寫鎖底層如何操作?

答案:

執行緒 a、b、c 的讀模式開啟,執行緒 d 的寫模式開啟,阻塞先要以寫方式獲取讀寫鎖的執行緒,直到所有的讀模式執行緒將讀寫鎖釋放,才進行加鎖操作

問題:

以上面的情況(有多個執行緒同時以讀的方式獲取讀寫鎖,在此之後,有乙個執行緒想要以寫的方式獲取讀寫鎖)為基礎,又來了乙個執行緒要以讀的方式獲取讀寫鎖 d ,c 會一直等到 d 讀完嗎?

答案:

不是,作業系統會先阻塞後面想要以讀方式開啟的 d,保證 c 不會等待太長時間,以免資源被長時間占用

介面測試常見問題

介面測試面試常見問題 get請求 和 post 請求的區別是什麼?post一般用作伺服器上資源的修改,如 上傳介面,登入註冊介面 get一般用於資訊獲取,相對而言上安全和冪等的 在做資料查詢時,建議用get方式。如 商品資訊介面,搜尋介面,部落格訪客介面 誤區 get是從伺服器上獲取資料,post是...

mysql鎖3 常見問題

1.請問聚簇索引上所有的記錄,都被加上了x鎖。無論記錄是否滿足條件,全部被加上x鎖。這個鎖的效果和表鎖有什麼區別?分析 這個跟據資料庫隔離級別決定的。rc隔離級別下,有區別,記錄仍舊可以插入。rr下,功能上無區別。但是innodb不會主動公升級表鎖。2.我想問的是,兩個測試,mysql都檢測到了死鎖...

UFT常見問題分析

常見執行出錯問題分析 1 物件庫保證有物件的存在 2 配置路徑的正確性 3 執行時程式的視窗與 是否對應 4 不可開啟多個視窗進行執行 5 注意值的匹配 問題解決方案 action1 resources 聯絡物件庫 到匯出來的檔案.wenjianming 從程式中更新物件時需注意的問題 選中物件的屬...