多線程的那點兒事(之讀寫鎖)

在編寫多線程的時候,有一種情況是十分常見的。那就是,有些公共數據修改的機會比較少。相比較改寫,它們讀的機會反而高的多。通常而言,在讀的過程中,往往伴隨著查找的操作,中間耗時很長。給這種代碼段加鎖,會極大地降低我們程序的效率。那么有沒有一種方法,可以專門處理這種多讀少寫的情況呢?
?? ?有,那就是讀寫鎖。

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

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

[cpp]?view plaincopy
  1. RWLock*?create_read_write_lock(HANDLE?hRead,?HANDLE?hWrite)??
  2. {??
  3. ????RWLock*?pRwLock?=?NULL;??
  4. ??
  5. ????assert(NULL?!=?hRead?&&?NULL?!=?hWrite);??
  6. ????pRwLock?=?(RWLock*)malloc(sizeof(RWLock));??
  7. ????
  8. ????pRwLock->hRead?=?hRead;??
  9. ????pRwLock->hWrite?=?hWrite;??
  10. ????pRwLock->count?=?0;??
  11. ????pRwLock->state?=?STATE_EMPTY;??
  12. ????return?pRwLock;??
  13. }??
?? ? (3)獲取讀鎖

[cpp]?view plaincopy
  1. void?read_lock(RWLock*?pRwLock)??
  2. {??
  3. ????assert(NULL?!=?pRwLock);??
  4. ??????
  5. ????WaitForSingleObject(pRwLock->hRead,?INFINITE);??
  6. ????pRwLock->counnt?++;??
  7. ????if(1?==?pRwLock->count){??
  8. ????????WaitForSingleObject(pRwLock->hWrite,?INFINITE);??
  9. ????????pRwLock->state?=?STATE_READ;??
  10. ????}??
  11. ????ReleaseMutex(pRwLock->hRead);??
  12. }??
?? ? (4)獲取寫鎖
[cpp]?view plaincopy
  1. void?write_lock(RWLock*?pRwLock)??
  2. {??
  3. ????assert(NULL?!=?pRwLock);??
  4. ??
  5. ????WaitForSingleObject(pRwLock->hWrite,?INFINITE);??
  6. ????pRwLock->state?=?STATE_WRITE;??
  7. }??
?? ? (5)釋放讀寫鎖
[cpp]?view plaincopy
  1. void?read_write_unlock(RWLock*?pRwLock)??
  2. {??
  3. ????assert(NULL?!=?pRwLock);??
  4. ??
  5. ????if(STATE_READ?==?pRwLock->state){??
  6. ????????WaitForSingleObject(pRwLock->hRead,?INFINITE);??
  7. ????????pRwLock->count?--;??
  8. ????????if(0?==?pRwLock->count){??
  9. ????????????pRwLock->state?=?STATE_EMPTY;??
  10. ????????????ReleaseMutex(pRwLock->hWrite);??
  11. ????????}??
  12. ????????ReleaseMutex(pRwLock->hRead);??
  13. ????}else{??
  14. ????????pRwLock->state?=?STATE_EMPTY;??
  15. ????????ReleaseMutex(pRwLock->hWrite);??
  16. ????}??
  17. ??????
  18. ????return;??
  19. }??

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458543.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458543.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458543.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS獲取設備IP

獲取iOS設備IP wifi和流量環境下 在網上找的比較好的獲取ip的代碼 #include <ifaddrs.h> #include <arpa/inet.h> #include <net/if.h> #define IOS_CELLULAR "pdp_ip0" #define IOS_WIFI "en0" #define IOS_VPN …

一些不錯的網站

http://www.huxiu.com/虎嗅網&#xff0c;一個關注最新創業信息的網站http://36kr.com/創業天花板https://www.zhihu.com/與世界分享你的經驗http://www.mafengwo.cn/世界那么大&#xff0c;想去哪就去那http://www.mt-bbs.com/找到屬于自己的設計本http://www.guokr.com/科技有…

[原]詳解如何將cocos2dx項目編譯到Android平臺上的(方式一:Cywin+NDK)

鏈接地址&#xff1a;http://m.blog.csdn.net/blog/yhc13429826359/29357815 2014-6-8閱讀578 評論0 前言&#xff1a;cocos2dx作為一個開源的移動2D游戲框架&#xff0c;其跨平臺的特性讓它備受開發公司的歡迎。這里我就不做概念性的解釋了&#xff0c;通過這篇文章你就會了解…

互斥鎖和讀寫鎖的區別

原文地址&#xff1a;http://blog.csdn.NET/u012884354/article/details/46691761 相交進程之間的關系主要有兩種&#xff0c;同步與互斥。 所謂互斥&#xff0c;是指散布在不同進程之間的若干程序片斷&#xff0c;當某個進程運行其中一個程序片段時&#xff0c;其它進程就不能…

JSP EL表達式使用

為什么80%的碼農都做不了架構師&#xff1f;>>> ##1.EL全名為Expression Language out.print(str) <%str%> ${str}例子&#xff1a; Hi! <%username%> 和 Hi! ${username}是一樣的 只要是支持servlet2.4/jsp2.0的Container就都可以在jsp網頁中直接使用e…

eclipse 中 Android sdk 無法更新的問題

誒&#xff0c;真是麻煩&#xff0c;想下個東西都下不了。我也好久沒折騰過這個了&#xff0c;在家的電腦是早就下載好了的&#xff0c;然后如今又須要下載一份。下不到。網上搜到了資料&#xff0c;記錄下來&#xff1a; 第一種方法:sdk manager - tools - option 選擇強制 xx…

iOS10 xcode8 分頁請求MJRefresh崩潰問題

MJRefresh出現崩潰現象 解決辦法&#xff1a;類庫增加判斷 if (range.location ! NSNotFound) { language [language substringToIndex:range.location]; }

網絡編程學習筆記一:Socket編程

from: http://blog.csdn.net/gneveek/article/details/8699198 “一切皆Socket&#xff01;” 話雖些許夸張&#xff0c;但是事實也是&#xff0c;現在的網絡編程幾乎都是用的socket。 ——有感于實際編程和開源項目研究。 我們深諳信息交流的價值&#xff0c;那網絡中進程之間…

JavaScript原生對象常用方法總結

這是4年前學習JavaScript基礎的學習筆記&#xff0c;當初是照著W3School教程學習的&#xff0c;4年恍然如云煙&#xff0c;仿佛還在昨天。現發布與此&#xff0c;留作紀念&#xff0c;紀念那段不悔的青蔥歲月。下面都是我學習W3C School教程中有關JavaScript寫的學習筆記&#…

[delphi]修改indy源碼后重新編譯

http://blog.csdn.net/nerdy/article/details/8702568 雖然indy有一身的毛病&#xff0c;但是一般情況下使用起來還是多方便的。 今天在做一個使用到indy的程序的時候&#xff0c;發現無論你怎么修改idhttp.request.accept-encoding&#xff0c;他都會在其后添加一個值 identit…

xcode8 崩潰問題

【1】、Xcode8代碼出現ubsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0 2016-09-14 17:18:…

前端工具--less篇

前端工具–less篇 less 中文網http://www.bootcss.com/p/lesscss/ 常見錯誤及解決&#xff1a; sublime text 3 安裝less2css保存less出現錯誤 未安裝這個 npm install -g less-plugin-clean-css 未安裝這個 npm install less -gd less語法 LESS 做為 CSS 的一種形式的擴展&a…

從static變量導出問題解析 __declspec(dllexport) 和 __declspec(dllimport)的作用

這段時間要把tinyxml從靜態庫弄成動態庫&#xff0c;要用到__declspec(dllexport)和__declspec(dllimport)來導出dll和lib文件。終于弄明白了export和import的作用&#xff0c;下面從使用的角度來說明一下他們的功能。 首先要知道&#xff0c;頭文件是C的接口文件&#xff0c;不…

4月26日作業

2016年4月26日作業 一、項目整體績效評估1、*三E審計是什么的合稱&#xff1f;&#xff08;記&#xff09; 答&#xff1a;經濟審計&#xff0c;效率審計和效果審計2、霍爾三維結構是從哪三個方面考察系統工程的工作過程的&#xff1f; 答&#xff1a;邏輯&#xff0c;時間和知…

xcode8 快捷鍵失效

因為蘋果解決xcode ghost,把插件屏蔽了。 解決方法: 命令運行&#xff1a; sudo /usr/libexec/xpccachectl 然后必須重啟電腦后生效

CAS單點登錄配置[3]:服務器端配置

在準備工作&#xff0c;證書生成等工作完成后&#xff0c;本篇介紹服務器端的配置。 JDK配置 1我們將生成的cacerts文件分別拷貝到JDK目錄下的jre/lib/security目錄下及JRE對應的目錄中&#xff0c;如果之前存在此文件&#xff0c;請替換&#xff1b; ENDTomcat配置 1Step 1:將…

DLL動態鏈接庫的工作原理

"動態鏈接"這幾字指明了DLLs是如何工作的。 對于常規的函數庫&#xff0c;鏈接器從中拷貝它需要的所有庫函數&#xff0c;并把確切的函數地址傳送給調用這些函數的程序。 而對于DLLs&#xff0c;函數儲存在一個獨立的動態鏈接庫文件中。在創建Windows程序時&#xff…

remind程序

2019獨角獸企業重金招聘Python工程師標準>>> 用了兩個定時器。一個控制刷新時間&#xff0c;一個控制響鈴。 定時器響應函數Timer: int wk; if(nIDEvent1) { CTime tCTime::GetCurrentTime(); wkt.GetDayOfWeek()-1; m_mnt.Format("%Y 年 …

查看手機是否安裝微信客戶端

if (![[UIApplication sharedApplication]canOpenURL:[NSURL URLWithString:"weixin://"]] ) {[wcatBtn setHidden:YES];}

Caffe學習系列(7):solver及其配置

solver算是caffe的核心的核心&#xff0c;它協調著整個模型的運作。caffe程序運行必帶的一個參數就是solver配置文件。運行代碼一般為 # caffe train --solver*_slover.prototxt 在Deep Learning中&#xff0c;往往loss function是非凸的&#xff0c;沒有解析解&#xff0c;我們…