多线程的那点儿事(之读写锁)
生活随笔
收集整理的這篇文章主要介紹了
多线程的那点儿事(之读写锁)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在編寫多線程的時候,有一種情況是十分常見的。那就是,有些公共數(shù)據(jù)修改的機會比較少。相比較改寫,它們讀的機會反而高的多。通常而言,在讀的過程中,往往伴隨著查找的操作,中間耗時很長。給這種代碼段加鎖,會極大地降低我們程序的效率。那么有沒有一種方法,可以專門處理這種多讀少寫的情況呢?
?? ?有,那就是讀寫鎖。
typedef?struct?_RWLock?? {?? ????int?count;?? ????int?state;?? ????HANDLE?hRead;?? ????HANDLE?hWrite;?? }RWLock;?????
?? ?同時,為了判斷當(dāng)前的鎖是處于讀狀態(tài),還是寫狀態(tài),我們要定義一個枚舉量,
[cpp]?view plaincopy typedef?enum?? {?? ????STATE_EMPTY?=?0,?? ????STATE_READ,?? ????STATE_WRITE?? };??
?? ?
(2)初始化數(shù)據(jù)結(jié)構(gòu)
RWLock*?create_read_write_lock(HANDLE?hRead,?HANDLE?hWrite)?? {?? ????RWLock*?pRwLock?=?NULL;?? ?? ????assert(NULL?!=?hRead?&&?NULL?!=?hWrite);?? ????pRwLock?=?(RWLock*)malloc(sizeof(RWLock));?? ???? ????pRwLock->hRead?=?hRead;?? ????pRwLock->hWrite?=?hWrite;?? ????pRwLock->count?=?0;?? ????pRwLock->state?=?STATE_EMPTY;?? ????return?pRwLock;?? }??
?? ?
(3)獲取讀鎖
void?read_lock(RWLock*?pRwLock)?? {?? ????assert(NULL?!=?pRwLock);?? ?????? ????WaitForSingleObject(pRwLock->hRead,?INFINITE);?? ????pRwLock->counnt?++;?? ????if(1?==?pRwLock->count){?? ????????WaitForSingleObject(pRwLock->hWrite,?INFINITE);?? ????????pRwLock->state?=?STATE_READ;?? ????}?? ????ReleaseMutex(pRwLock->hRead);?? }??
?? ?
(4)獲取寫鎖
[cpp]?view plaincopy void?write_lock(RWLock*?pRwLock)?? {?? ????assert(NULL?!=?pRwLock);?? ?? ????WaitForSingleObject(pRwLock->hWrite,?INFINITE);?? ????pRwLock->state?=?STATE_WRITE;?? }??
?? ?
(5)釋放讀寫鎖
[cpp]?view plaincopy void?read_write_unlock(RWLock*?pRwLock)?? {?? ????assert(NULL?!=?pRwLock);?? ?? ????if(STATE_READ?==?pRwLock->state){?? ????????WaitForSingleObject(pRwLock->hRead,?INFINITE);?? ????????pRwLock->count?--;?? ????????if(0?==?pRwLock->count){?? ????????????pRwLock->state?=?STATE_EMPTY;?? ????????????ReleaseMutex(pRwLock->hWrite);?? ????????}?? ????????ReleaseMutex(pRwLock->hRead);?? ????}else{?? ????????pRwLock->state?=?STATE_EMPTY;?? ????????ReleaseMutex(pRwLock->hWrite);?? ????}?? ?????? ????return;?? }??
文章總結(jié):
?? ?(1)讀寫鎖的優(yōu)勢只有在多讀少寫、代碼段運行時間長這兩個條件下才會效率達(dá)到最大化;
?? ?(2)任何公共數(shù)據(jù)的修改都必須在鎖里面完成;
?? ?(3)讀寫鎖有自己的應(yīng)用場所,選擇合適的應(yīng)用環(huán)境十分重要;
?? ?(4)編寫讀寫鎖很容易出錯,朋友們應(yīng)該多加練習(xí);
?? ?(5)讀鎖和寫鎖一定要分開使用,否則達(dá)不到效果。
?? ?有,那就是讀寫鎖。
?? ?(1)首先,我們定義一下基本的數(shù)據(jù)結(jié)構(gòu)。
[cpp]?view plaincopy
[cpp]?view plaincopy
[cpp]?view plaincopy
[cpp]?view plaincopy
[cpp]?view plaincopy
[cpp]?view plaincopy
文章總結(jié):
?? ?(1)讀寫鎖的優(yōu)勢只有在多讀少寫、代碼段運行時間長這兩個條件下才會效率達(dá)到最大化;
?? ?(2)任何公共數(shù)據(jù)的修改都必須在鎖里面完成;
?? ?(3)讀寫鎖有自己的應(yīng)用場所,選擇合適的應(yīng)用環(huán)境十分重要;
?? ?(4)編寫讀寫鎖很容易出錯,朋友們應(yīng)該多加練習(xí);
?? ?(5)讀鎖和寫鎖一定要分開使用,否則達(dá)不到效果。
總結(jié)
以上是生活随笔為你收集整理的多线程的那点儿事(之读写锁)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 后缀名是ofd是什么文件?可以转成PDF
- 下一篇: root 帐户无法登陆解决办法