diy資料庫(四) 鎖和佇列

2021-07-11 06:37:39 字數 2614 閱讀 3360

一、鎖的概述

1.互斥鎖

用來保證臨界資源被互斥訪問。

2.讀寫鎖

在乙個執行緒中,當乙個讀寫鎖中的讀鎖被申請後,其他執行緒可以再申請讀鎖,但不能申請寫鎖。

在乙個執行緒中,當乙個讀寫鎖中的寫鎖被申請後,其他執行緒不能申請讀鎖,也不能申請寫鎖。

3.自旋鎖

等待條件時,不讓出cpu。nginx中由於每個工作程序要求快速響應使用者,就用到了自選鎖。

4.遞迴鎖

同乙個執行緒可以對乙個遞迴鎖加鎖多次(其他鎖沒有這樣的功能),但必須解鎖同樣多次。

另外,主要通過條件變數和訊號量來進行執行緒間同步。

二、diy資料庫中鎖的實現

#ifndef osslatch_hpp__

#define osslatch_hpp__

#include "core.hpp"

#define oss_mutex_t pthread_mutex_t

#define oss_mutex_init pthread_mutex_init

#define oss_mutex_destroy pthread_mutex_destroy

#define oss_mutex_lock pthread_mutex_lock

#define oss_mutex_trylock(__lock) (pthread_mutex_trylock( (__lock) ) == 0 )

#define oss_mutex_unlock pthread_mutex_unlock

#define oss_rwlock_t pthread_rwlock_t

#define oss_rwlock_init pthread_rwlock_init

#define oss_rwlock_destroy pthread_rwlock_destroy

#define oss_rwlock_rdlock pthread_rwlock_rdlock

#define oss_rwlock_rdunlock pthread_rwlock_unlock

#define oss_rwlock_wrlock pthread_rwlock_wrlock

#define oss_rwlock_wrunlock pthread_rwlock_unlock

#define oss_rwlock_rdtrylock(__lock) (pthread_rwlock_tryrdlock( (__lock) ) == 0 )

#define oss_rwlock_wrtrylock(__lock) (pthread_rwlock_trywrlock ( ( __lock) ) == 0 )

enum oss_latch_mode

;class ossxlatch//互斥鎖

~ossxlatch ()

void get ()

void release ()

bool try_get ()

} ;class ossslatch//共享鎖

~ossslatch ()

void get ()//寫鎖

void release ()

bool try_get ()

void get_shared ()//讀鎖

void release_shared ()

bool try_get_shared ()

} ;#endif

(1)這裡的互斥鎖和共享鎖分別是對作業系統中的互斥鎖和讀寫鎖的簡單封裝

(2)對系統呼叫用巨集定義取別名,體現了oss層對平台相關系統呼叫的封裝的思想

(3)我們的資料庫是用執行緒池的框架,本身要求有執行緒切換,所以不必用自旋鎖來提高效率

三、佇列的概述

#ifndef ossqueue_hpp__

#define ossqueue_hpp__

#include #include #include #include "core.hpp"

templateclass ossqueue

void push ( data const &data )//壓入靜態資料

bool empty () const

bool try_pop ( data &value )//嘗試彈出

void wait_and_pop ( data &value )//等待並且彈出

value = _queue.front () ;

_queue.pop () ;

}bool timed_wait_and_pop ( data &value, long long millsec )

}value = _queue.front () ;

_queue.pop () ;

return true ;

}} ;#endif

(1)多執行緒中的訊息佇列是共享資源,所以在對佇列進行操作時必須加鎖

(2)執行緒間的同步主要用條件變數來實現,值得注意的是條件變數的使用一定伴隨著乙個互斥鎖

(3)這裡用到了boost中的互斥鎖和條件變數,但實際上使用博文《實現乙個執行緒池》中的互斥鎖和條件變數包裝類也可以。

diy資料庫系列(引言)

最近學習了一下emeralddb,所以想以此為藍本重寫一下這個資料庫,從而加深自己對emeralddb的理解,也提公升一下自己的伺服器程式設計能力。重寫的資料庫命名為diydb。一 diy資料庫的主要特點 1.支援分割槽儲存,即資料庫中的資料被雜湊到資料庫集群的各個節點上。2.資料交格式為json,...

資料庫事務和鎖

事務是作為單個邏輯工作單元執行的一系列操作,乙個邏輯工作單元必須有四個屬性 原子性,一致性,隔離性和永續性 acid 屬性。事務的回滾 將顯式事務或者隱式事務回滾到事務的起始點或者是事務內的儲存點。關於鎖的引入 併發導致的幾種問題 引入鎖既可以在一段時間內禁止使用者做某些操作以免導致產生資料不一致。...

資料庫事務和鎖

鎖 回滾 作為工作單元執行的一系列操作。顯式事務和隱式事務 排它鎖exclusive lock 共享鎖shared lock 更新鎖 相容共享鎖,不相容更新鎖 排它鎖 意向鎖目的 在較高粒度級別有效監測不相容的鎖定請求,防止授予不相容的鎖。架構鎖其他更高階鎖事務之間相互制約的關係就是鎖的相容性。可鎖...