[發(fā)明專利]一種高效讀寫鎖的實現(xiàn)方法在審
| 申請?zhí)枺?/td> | 201611095878.3 | 申請日: | 2016-12-02 |
| 公開(公告)號: | CN106776051A | 公開(公告)日: | 2017-05-31 |
| 發(fā)明(設(shè)計)人: | 王永峰;堯津來 | 申請(專利權(quán))人: | 北京銳安科技有限公司 |
| 主分類號: | G06F9/52 | 分類號: | G06F9/52;G06F9/54 |
| 代理公司: | 北京君尚知識產(chǎn)權(quán)代理事務(wù)所(普通合伙)11200 | 代理人: | 司立彬 |
| 地址: | 100192 北京市海*** | 國省代碼: | 北京;11 |
| 權(quán)利要求書: | 查看更多 | 說明書: | 查看更多 |
| 摘要: | |||
| 搜索關(guān)鍵詞: | 一種 高效 讀寫 實現(xiàn) 方法 | ||
技術(shù)領(lǐng)域
本發(fā)明涉及計算機多線程,原子操作,讀寫鎖。具體來說,在多線程環(huán)境下,利用原子操作,實現(xiàn)高效的讀寫鎖方法。
背景技術(shù)
在多線程環(huán)境下,有這樣一種場景(即一種單讀、單寫的場景),對于一段共享數(shù)據(jù)隊列,只有一個用戶做寫操作,同時也只有一個用戶做讀操作的情況下,如何提高線程讀寫鎖效率;常用的方法是利用操作系統(tǒng)提供的線程鎖,如圖1所示,這種方式功能強大,適應(yīng)性高,但在此場景效率低,因為線程鎖采用的是阻塞的方式,另外,線程鎖調(diào)用本身也有開銷,如果大量的調(diào)用加鎖/解鎖的話,開銷也比較大。
發(fā)明內(nèi)容
針對現(xiàn)有技術(shù)中存在的技術(shù)問題,本發(fā)明的目的是提供一種高效讀寫鎖的實現(xiàn)方法,本發(fā)明通過一種無需加鎖的方法,來實現(xiàn)2個線程(一個讀線程和一個寫線程)對一個共享數(shù)據(jù)隊列的訪問。
為了實現(xiàn)上述目的,本發(fā)明的解決方案是:
一種高效讀寫鎖的實現(xiàn)方法,其步驟為:
1)程序的主線程初始化共享數(shù)據(jù)隊列,為該共享數(shù)據(jù)隊列設(shè)置一寫線程和一讀線程,以及設(shè)置一整數(shù)變量M來保存該共享數(shù)據(jù)隊列最大長度,設(shè)置一變量K保存當(dāng)前該共享數(shù)據(jù)隊列中的數(shù)據(jù)個數(shù);
2)當(dāng)該程序需要對該共享數(shù)據(jù)隊列進行寫操作時,該主線程調(diào)用該共享數(shù)據(jù)隊列的寫線程,該寫線程做寫操作前,先檢查K,如果K<M,則把要寫的數(shù)據(jù)插入到該共享數(shù)據(jù)隊列的寫端,并且增加K的計數(shù)值;
3)當(dāng)該程序需要對該共享數(shù)據(jù)隊列進行讀操作時,該主線程調(diào)用該共享數(shù)據(jù)隊列的讀線程,該讀線程做讀操作前,檢查K,如果K>0,則從該共享數(shù)據(jù)隊列的讀端讀取一個元素,并且減少K的計數(shù)值。
進一步的,所述步驟2)中,如果K大于或等于M,即該共享數(shù)據(jù)隊列已滿,則丟棄當(dāng)前要寫的數(shù)據(jù)。
進一步的,所述步驟2)中,如果K大于或等于M,即該共享數(shù)據(jù)隊列已滿,則等待該共享數(shù)據(jù)隊列未滿時,將當(dāng)前要寫的數(shù)據(jù)插入到該共享數(shù)據(jù)隊列的寫端,并且增加K的計數(shù)值。
進一步的,所述步驟3)中,如果K=0,即該共享數(shù)據(jù)隊列為空,則采取等待或者輪詢的方式檢測該共享數(shù)據(jù)隊列中是否存在數(shù)據(jù),如果存在,則從該共享數(shù)據(jù)隊列的讀端讀取一個元素,并且減少K的計數(shù)值。
進一步的,該共享數(shù)據(jù)隊列中的元素為寫入數(shù)據(jù)的指針。
本發(fā)明的主要內(nèi)容包括:
a.程序的主線程初始化共享數(shù)據(jù)隊列,用一個整數(shù)變量M來保存該共享數(shù)據(jù)隊列最大長度,K保存當(dāng)前該共享數(shù)據(jù)隊列中的數(shù)據(jù)個數(shù)。
b.當(dāng)程序需要對該共享數(shù)據(jù)隊列進行寫操作時,主線程調(diào)用該共享數(shù)據(jù)隊列的寫線程,該寫線程做寫操作前,先檢查K,如果K<M,運行push操作,即把要寫的數(shù)據(jù)插入到該共享數(shù)據(jù)隊列的寫端,并且K++,如果K>=M,說明該共享數(shù)據(jù)隊列已滿,那么可以采取丟棄或者等待的方式。
c.當(dāng)程序需要對該共享數(shù)據(jù)隊列進行讀操作時,主線程調(diào)用該共享數(shù)據(jù)隊列的讀線程,該讀線程做讀操作前,檢查K,如果K>0,執(zhí)行pop操作,即從該共享數(shù)據(jù)隊列的讀端讀取一個元素,K--,如果K=0,說明該共享數(shù)據(jù)隊列為空,那么可以采取等待或者輪詢的方式。
與現(xiàn)有技術(shù)相比,本發(fā)明的優(yōu)點和積極效果為:
在本發(fā)明中,在單讀單寫的情況下,通過整數(shù)加減操作,對共享數(shù)據(jù)隊列中的元素進行訪問。相對于采用線程鎖,本發(fā)明大大提高了讀寫效率,消除了由于頻繁的調(diào)用線程鎖而產(chǎn)生的開銷。
附圖說明
圖1為傳統(tǒng)讀寫鎖的流程圖;
圖2為本發(fā)明方法的流程圖。
具體實現(xiàn)方式
本發(fā)明流程如圖2所示,具體如下:
(1)程序啟動后,由該程序的主線程來初始化共享數(shù)據(jù)隊列并創(chuàng)建讀線程和寫線程,該共享數(shù)據(jù)隊列中的元素為寫入數(shù)據(jù)的指針,共享數(shù)據(jù)隊列最大長度為M,共享數(shù)據(jù)隊列當(dāng)前元素個數(shù)為K,K=0。
(2)當(dāng)程序需要對該共享數(shù)據(jù)隊列進行寫操作時,主線程調(diào)用該共享數(shù)據(jù)隊列的寫線程,該寫線程操作的時候,檢查K,如果K<M,寫線程執(zhí)行隊列的push操作,即把要寫的數(shù)據(jù)插入到共享數(shù)據(jù)隊列的寫端,并執(zhí)行K++;如果K>=M,返回NULL,表示共享數(shù)據(jù)隊列已經(jīng)滿了,本次寫入失敗,可以根據(jù)自身需要進行等待或者輪詢。
該專利技術(shù)資料僅供研究查看技術(shù)是否侵權(quán)等信息,商用須獲得專利權(quán)人授權(quán)。該專利全部權(quán)利屬于北京銳安科技有限公司,未經(jīng)北京銳安科技有限公司許可,擅自商用是侵權(quán)行為。如果您想購買此專利、獲得商業(yè)授權(quán)和技術(shù)合作,請聯(lián)系【客服】
本文鏈接:http://www.szxzyx.cn/pat/books/201611095878.3/2.html,轉(zhuǎn)載請聲明來源鉆瓜專利網(wǎng)。
- 上一篇:多用戶進程互斥方法及裝置
- 下一篇:共享資源訪問方法和裝置
- 互動業(yè)務(wù)終端、實現(xiàn)系統(tǒng)及實現(xiàn)方法
- 街景地圖的實現(xiàn)方法和實現(xiàn)系統(tǒng)
- 游戲?qū)崿F(xiàn)系統(tǒng)和游戲?qū)崿F(xiàn)方法
- 圖像實現(xiàn)裝置及其圖像實現(xiàn)方法
- 增強現(xiàn)實的實現(xiàn)方法以及實現(xiàn)裝置
- 軟件架構(gòu)的實現(xiàn)方法和實現(xiàn)平臺
- 數(shù)值預(yù)報的實現(xiàn)方法及實現(xiàn)系統(tǒng)
- 空調(diào)及其冬眠控制模式實現(xiàn)方法和實現(xiàn)裝置以及實現(xiàn)系統(tǒng)
- 空調(diào)及其睡眠控制模式實現(xiàn)方法和實現(xiàn)裝置以及實現(xiàn)系統(tǒng)
- 輸入設(shè)備實現(xiàn)方法及其實現(xiàn)裝置





