日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多线程的那点儿事(之读写锁)

發布時間:2023/12/20 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程的那点儿事(之读写锁) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在編寫多線程的時候,有一種情況是十分常見的。那就是,有些公共數據修改的機會比較少。相比較改寫,它們讀的機會反而高的多。通常而言,在讀的過程中,往往伴隨著查找的操作,中間耗時很長。給這種代碼段加鎖,會極大地降低我們程序的效率。那么有沒有一種方法,可以專門處理這種多讀少寫的情況呢?
?? ?有,那就是讀寫鎖。

?? ?(1)首先,我們定義一下基本的數據結構。

[cpp]?view plaincopy
  • typedef?struct?_RWLock??
  • {??
  • ????int?count;??
  • ????int?state;??
  • ????HANDLE?hRead;??
  • ????HANDLE?hWrite;??
  • }RWLock;?????
  • ?? ?同時,為了判斷當前的鎖是處于讀狀態,還是寫狀態,我們要定義一個枚舉量,
    [cpp]?view plaincopy
  • typedef?enum??
  • {??
  • ????STATE_EMPTY?=?0,??
  • ????STATE_READ,??
  • ????STATE_WRITE??
  • };??
  • ?? ? (2)初始化數據結構

    [cpp]?view plaincopy
  • 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)獲取讀鎖

    [cpp]?view plaincopy
  • 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;??
  • }??

  • 文章總結:
    ?? ?(1)讀寫鎖的優勢只有在多讀少寫、代碼段運行時間長這兩個條件下才會效率達到最大化;
    ?? ?(2)任何公共數據的修改都必須在鎖里面完成;
    ?? ?(3)讀寫鎖有自己的應用場所,選擇合適的應用環境十分重要;
    ?? ?(4)編寫讀寫鎖很容易出錯,朋友們應該多加練習;
    ?? ?(5)讀鎖和寫鎖一定要分開使用,否則達不到效果。

    總結

    以上是生活随笔為你收集整理的多线程的那点儿事(之读写锁)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。