多執行緒的那點兒事(之順序鎖)
阿新 • • 發佈:2019-01-29
說明:本文轉自http://blog.csdn.net/feixiaoxing/article/details/7051346
【 宣告:版權所有,歡迎轉載,請勿用於商業用途。 聯絡信箱:feixiaoxing @163.com】
在互斥資料訪問中有一種多讀少寫的情況。正對這麼一種情形,我們也提出了讀寫鎖的方案。但是呢,這個鎖有些缺陷。什麼缺陷呢?那就是,這個寫鎖需要在所有的讀鎖完成之後才能寫。否則的話,寫鎖需要這麼一直等下去。
那麼,有沒有什麼辦法能使得寫操作快速一點進行呢?那就是順序鎖。
- typedefstruct _SEQUENCE_LOCK
- {
-
unsigned int
- HANDLE hLock;
- }SEQUENCE_LOCK;
- unsigned int get_lock_begin(SEQUENCE_LOCK* hSeqLock)
- {
- assert(NULL != hSeqLock);
- return hSeqLock->sequence;
- }
- int get_lock_retry(SEQUENCE_LOCK* hSeqLock, unsigned int value)
- {
-
unsigned int
- assert(NULL != hSeqLock);
- new_value = hSeqLock->sequence;
- return (new_value & 0x1) || (new_value ^ value);
- }
- void get_write_lock(SEQUENCE_LOCK* hSeqLock)
- {
- assert(NULL != hSeqLock);
-
WaitForSingleObject(hSeqLock->hLock);
- hSeqLock->sequence ++;
- }
- void release_write_lock(SEQUENCE_LOCK* hSeqLock)
- {
- assert(NULL != hSeqLock);
- hSeqLock->sequence ++;
- ReleaseMutex(hSeqLock->hLock);
- }
- void read_process(SEQUENCE_LOCK* hSeqLock)
- {
- unsigned int sequence;
- do{
- sequence = get_lock_begin(hSeqLock);
- /* read operation */
- }while(get_lock_retry(hSeqLock, sequence));
- }
- void write_process(SEQUENCCE_LOCK* hSeqLock)
- {
- get_write_lock(hSeqLock);
- /* write operation */
- release_write_lock(hSeqLock);
- }
總結:
(1)讀鎖退出有兩個條件,要麼寫操作正在進行呢,要麼沒有寫鎖
(2)寫鎖之間需要互斥操作
(3)互斥操作的資料不能是指標,否則有可能在訪問的時候會造成異常,因為有可能邊寫邊讀
(4)順序鎖代替不了讀寫鎖,因為讀寫鎖可以保證所有的資料操作,而順序鎖不行