• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-3  評(píng)論-5  文章-13  trackbacks-0

            --------------------------------------------------------------------------------
            標(biāo)題: 在Win32平臺(tái)中,多讀單寫(xiě)鎖如何實(shí)現(xiàn)?
            作者: 葉飛虎
            日期: 2004.03.17
            --------------------------------------------------------------------------------

               在多線程編程中,讀寫(xiě)鎖主要應(yīng)用于寫(xiě)數(shù)據(jù)相對(duì)比較少,而讀比較多,同時(shí)要求并發(fā)性
            比較高的時(shí)候。

            現(xiàn)給出讀寫(xiě)鎖代碼,如下:

             

              1 /* TKYLockRW - 多讀單寫(xiě)鎖類 */
              2 
              3 class TKYLockRW
              4 {
              5 public:
              6    TKYLockRW();
              7    virtual ~TKYLockRW();
              8 
              9    bool              LockRead();
             10    bool              LockWrite();
             11 
             12    bool              TryLockRead();
             13    bool              TryLockWrite();
             14 
             15    void              UnlockRead();
             16    void              UnlockWrite();
             17 
             18 private:
             19    void              Lock()            { EnterCriticalSection(&FRWLock); }
             20    void              Unlock()          { LeaveCriticalSection(&FRWLock); }
             21 
             22    inline void       SetReadSignal();
             23    inline void       SetWriteSignal();
             24 
             25 private:
             26    CRITICAL_SECTION  FRWLock;
             27    HANDLE            FReaderEvent;
             28    HANDLE            FWriterEvent;
             29    long              FReadingCount;
             30    long              FWritingCount;
             31    long              FWaitingReadCount;
             32    long              FWaitingWriteCount;
             33 };
             34 
             35 /* TKYLockRW - 多讀單寫(xiě)鎖類 */
             36 
             37 // ---------------- 構(gòu)造函數(shù)和析構(gòu)函數(shù) ----------------
             38 // 構(gòu)造函數(shù)
             39 TKYLockRW::TKYLockRW()
             40 {
             41    // 初始化
             42    FReadingCount     = 0;
             43    FWritingCount     = 0;
             44    FWaitingReadCount = 0;
             45    FWaitingWriteCount= 0;
             46 
             47    // 創(chuàng)建臨界區(qū)和讀寫(xiě)者事件
             48    InitializeCriticalSection(&FRWLock);
             49    FReaderEvent      = CreateEvent(NULL, FALSE, FALSE, NULL);
             50    FWriterEvent      = CreateEvent(NULL, FALSE, FALSE, NULL);
             51 }
             52 
             53 // 析構(gòu)函數(shù)
             54 TKYLockRW::~TKYLockRW()
             55 {
             56    // 置釋放標(biāo)志
             57    Lock();
             58    bool bWaiting = (FReadingCount > 0|| (FWritingCount == 1)
             59                                        || (FWaitingReadCount > 0)
             60                                        || (FWaitingWriteCount > 0);
             61    FReadingCount = -1;
             62    Unlock();
             63 
             64    // 等待一會(huì)兒
             65    if (bWaiting)
             66       Sleep(10);
             67 
             68    // 釋放臨界區(qū)和讀寫(xiě)者事件
             69    CloseHandle(FReaderEvent);
             70    CloseHandle(FWriterEvent);
             71    DeleteCriticalSection(&FRWLock);
             72 }
             73 
             74 // ---------------- 私有方法 ----------------
             75 // 設(shè)置讀信號(hào)
             76 inline void TKYLockRW::SetReadSignal()
             77 {
             78    // FWritingCount 作為讀信號(hào)廣播的個(gè)數(shù)
             79    if (FWritingCount == 0)
             80       FWritingCount = -FWaitingReadCount;
             81 
             82    // 是否需要繼續(xù)廣播
             83    if (FWritingCount < 0)
             84    {
             85       FWritingCount++;
             86       FReadingCount++;
             87       FWaitingReadCount--;
             88 
             89       SetEvent(FReaderEvent);
             90    }
             91 }
             92 
             93 // 設(shè)置寫(xiě)信號(hào)
             94 inline void TKYLockRW::SetWriteSignal()
             95 {
             96    FWritingCount = 1;
             97    FWaitingWriteCount--;
             98 
             99    SetEvent(FWriterEvent);
            100 }
            101 
            102 // ---------------- 公有方法 ----------------
            103 // 讀加鎖
            104 bool TKYLockRW::LockRead()
            105 {
            106    bool result   = true;
            107    bool bWaiting = false;
            108 
            109    // 讀數(shù)加 1
            110    Lock();
            111    if (FReadingCount == -1)      // 釋放標(biāo)志
            112       result = false;
            113    else if ((FWritingCount == 1|| (FWaitingWriteCount > 0))
            114    {
            115       FWaitingReadCount++;
            116       bWaiting = true;
            117    }
            118    else
            119       FReadingCount++;
            120    Unlock();
            121 
            122    // 判斷是否等待讀信號(hào)
            123    if (bWaiting)
            124    {
            125       // 等待讀信號(hào)
            126       result = (WaitForSingleObject(FReaderEvent, INFINITE) == WAIT_OBJECT_0);
            127 
            128       if (result)
            129       {
            130          // 若廣播個(gè)數(shù)不為零則繼續(xù)置信號(hào)
            131          Lock();
            132          if (FWritingCount < 0)
            133             SetReadSignal();
            134          Unlock();
            135       }
            136    }
            137 
            138    // 返回結(jié)果
            139    return result;
            140 }
            141 
            142 // 寫(xiě)加鎖
            143 bool TKYLockRW::LockWrite()
            144 {
            145    bool result   = true;
            146    bool bWaiting = false;
            147 
            148    // 寫(xiě)數(shù)置 1
            149    Lock();
            150    if (FReadingCount == -1)      // 釋放標(biāo)志
            151       result = false;
            152    else if ((FWritingCount == 1|| (FReadingCount > 0))
            153    {
            154       FWaitingWriteCount++;
            155       bWaiting = true;
            156    }
            157    else
            158       FWritingCount = 1;
            159    Unlock();
            160 
            161    // 判斷是否等待寫(xiě)信號(hào)
            162    if (bWaiting)
            163       result = (WaitForSingleObject(FWriterEvent, INFINITE) == WAIT_OBJECT_0);
            164 
            165    // 返回結(jié)果
            166    return result;
            167 }
            168 
            169 // 讀試著加鎖
            170 bool TKYLockRW::TryLockRead()
            171 {
            172    bool result = true;
            173 
            174    // 讀數(shù)加 1
            175    Lock();
            176    if ((FReadingCount == -1|| (FWritingCount == 1)
            177                              || (FWaitingWriteCount > 0))
            178       result = false;
            179    else
            180       FReadingCount++;
            181    Unlock();
            182 
            183    // 返回結(jié)果
            184    return result;
            185 }
            186 
            187 // 寫(xiě)試著加鎖
            188 bool TKYLockRW::TryLockWrite()
            189 {
            190    bool result = true;
            191 
            192    // 寫(xiě)數(shù)置 1
            193    Lock();
            194    if ((FReadingCount == -1|| (FWritingCount == 1)
            195                              || (FReadingCount > 0))
            196       result = false;
            197    else
            198       FWritingCount = 1;
            199    Unlock();
            200 
            201    // 返回結(jié)果
            202    return result;
            203 }
            204 
            205 // 讀解鎖
            206 void TKYLockRW::UnlockRead()
            207 {
            208    Lock();
            209    if (FReadingCount > 0)
            210    {
            211       // 讀數(shù)減 1
            212       FReadingCount--;
            213 
            214       // 置讀/寫(xiě)信號(hào)
            215       if (FReadingCount == 0)
            216       {
            217          if (FWaitingWriteCount > 0)
            218             SetWriteSignal();
            219          else
            220             SetReadSignal();
            221       }
            222    }
            223    Unlock();
            224 }
            225 
            226 // 寫(xiě)解鎖
            227 void TKYLockRW::UnlockWrite()
            228 {
            229    Lock();
            230    if (FWritingCount == 1)
            231    {
            232       // 寫(xiě)數(shù)置 0
            233       FWritingCount = 0;
            234 
            235       // 置讀/寫(xiě)信號(hào)
            236       if (FWaitingWriteCount > FWaitingReadCount)
            237          SetWriteSignal();
            238       else
            239          SetReadSignal();
            240    }
            241    Unlock();
            242 }
            243 
            244 

             

            posted on 2011-05-22 11:22 Kyee Ye 閱讀(666) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++類庫(kù)KYLib 源碼
            久久精品国产99国产精偷| 精品久久人人妻人人做精品| 久久精品久久久久观看99水蜜桃| 7777久久久国产精品消防器材| 大伊人青草狠狠久久| 久久99国产一区二区三区| 久久亚洲中文字幕精品一区| 国产一级持黄大片99久久| 亚洲国产综合久久天堂| 91精品日韩人妻无码久久不卡| 久久精品一本到99热免费| 94久久国产乱子伦精品免费| 亚洲中文久久精品无码| 性做久久久久久久久久久| 69久久夜色精品国产69| 久久久久亚洲国产| 国产精品九九久久免费视频 | 97久久久精品综合88久久| 久久综合亚洲色HEZYO国产| 2021国产成人精品久久| 久久精品99久久香蕉国产色戒 | 嫩草影院久久国产精品| 久久久婷婷五月亚洲97号色| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 国产精品久久久久AV福利动漫| 香蕉久久永久视频| 久久国产乱子伦精品免费午夜| 99久久成人国产精品免费| 久久久一本精品99久久精品88| 狠狠色婷婷久久一区二区| 久久人妻AV中文字幕| A级毛片无码久久精品免费| 99精品国产免费久久久久久下载| 久久国产美女免费观看精品| 欧洲国产伦久久久久久久| 精品国产日韩久久亚洲| 亚洲天堂久久久| 中文字幕热久久久久久久| 久久永久免费人妻精品下载| 少妇久久久久久久久久| 好属妞这里只有精品久久|