資料庫讀寫鎖的實現(C )

2021-06-22 12:06:46 字數 2645 閱讀 3935

在資料庫中,對某資料的兩個基本操作為寫和讀,分布有兩種鎖控制:排它鎖(x鎖)、共享鎖(s鎖)。

排它鎖(x鎖):若事務t對資料d加x鎖,則其它任何事務都不能再對d加任何型別的鎖,直至t釋放d上的x鎖;

一般要求在修改資料前要向該資料加排它鎖,所以排它鎖又稱為寫鎖。

共享鎖(s鎖):若事務t對資料d加s鎖,則其它事務只能對d加s鎖,而不能加x鎖,直至t釋放d上的s鎖;

一般要求在讀取資料前要向該資料加共享鎖, 所以共享鎖又稱讀鎖。

程式所收到的請求包括以下五種:start、end、xlock、slock、unlock

start:開啟相應的事件請求

end:  關閉相應的事件請求

xlock: 對資料物件d新增x鎖,進行寫操作(當事件以對資料a加入s鎖時,此時可公升級為x鎖)

slock: 對資料物件d新增s鎖,進行讀操作

unlock: 對資料物件d進行解鎖(對資料d的x/s鎖解綁,並檢查等待佇列)

本程式並不進行死鎖檢測以及死鎖預防,對於等待佇列採取fifo原則進行。

讀寫鎖維護乙個資料d的狀態表,標記當前資料d的實時狀態,鎖表的資訊隨著事務的執行動態更新,反映當前的鎖狀態。

其資料結構如下圖所示:

其中:mobjectlist:為map結構的物件樹,可方便快速查詢相應物件。

objectname:為物件資料d的名稱

curxlocktrans: 為當前寫操作的事件

waitingtranslist: 為寫等待佇列

sharelist: 為共享集(當curxlocktrans不為空時,變為共享等待佇列)

事件id的資料結構如下:

其中:mtransid: 為map結構的事件樹,可以快速的查詢相應事件

tranid: 為事件名稱

curlockobjlist: 為此事件目前所操作的物件列表

三、源**

資料結構如下:

class lmer ;

struct transid

;mapmobjectlist;

mapmtransid;

public:

lmer(){}

string lmer::handleinput(vector& vinput);

void lmer::handleaction(string saction, transid* trid, object* obj, string& result);

void lmer::divitransid(transid* trid, object* pobj, string& result);

};

邏輯結構實現如下:

string lmer::handleinput(vector& vinput)

//清空請求事件

mtransid.erase(transit);}}

else if(vinput[0] == "start")//為start,創立程序

}else //三引數輸入

if (vinput[0] == "unlock")

else//進行常規處理(xlock、slock)

}return result;

}void lmer::handleaction(string saction, transid* trid, object* obj, string& result)

else//被占用

}else if(saction == "xlock")

obj->waitingtranslist.push(trid->tranid);

result += "waiting for lock (s-lock held by:" + stemp + "\n";

}else if (sharenum == 1)

else

}else if (sharenum == 0)

}else//當前存在寫操作

}}void lmer::divitransid(transid* trid, object* pobj, string& result)

else

}//對共享讀集合解綁

else

else

}//檢視寫等待佇列

if (pobj->waitingtranslist.size() != 0)

//檢視共享佇列

else if (pobj->sharelist.size() != 0)

result += "s-lock on "+ pobj->objectname +" granted to "+ temp +"\n";}}

四、程式執行

程式資料輸入如下:

執行後得到結果如下:

C 實現讀寫鎖ReadWriteLock

1 讀寫鎖基本思想 寫者之間互斥 寫者和讀者之間互斥,而讀者之間並不需要互斥 2 讀寫鎖分為兩種 讀者優先和寫者優先 讀者優先,即當前只要可讀,就是可進入的 寫者優先,讀者需要看看當前是否有寫者要讀,如果有,則等待至沒有寫者正在寫或者需要寫的情況 注 兩種方式,都會存在飢餓現象 include re...

讀寫鎖的實現!

寫程式過程中總免不了用到鎖,雖然大牛們總是推薦無鎖程式設計,但那境界對我來說實在太遠了。專案中的資料資源的訪問,少不了鎖,考慮到都是讀的多,寫的少,於是參考網路,自己實現乙個寫優先的讀寫鎖。windows下的 class rwlock include rwlock.h rwlock rwlock r...

讀寫鎖的實現

首先介紹下pthread cond t。在linux下稱之為狀態變數,與之相關的有下面幾個api int pthread cond init pthread cond t cond,pthread condattr t cond attr int pthread cond signal pthrea...