在資料庫中,對某資料的兩個基本操作為寫和讀,分布有兩種鎖控制:排它鎖(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...