1. 程式人生 > >一個寫優先的讀寫鎖實現

一個寫優先的讀寫鎖實現


/* g++ -Wall -o rwlock rwlock.cpp -lpthread
*
* 一個寫優先讀寫鎖的實現,多執行緒頻繁讀,多執行緒少量寫,同時寫優先,效能極佳。
* 當寫鎖(獨佔鎖)lock成功的必要條件是:
* 1. 將寫鎖計數++;
* 2. 會阻塞後續對讀鎖(共享鎖)的讀;
* 3. 等待讀鎖的計數為0;
* 4. 等待寫鎖的計數為1;
*
*/
#include<pthread.h>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include
<time.h>
usingnamespace std;
classRWLock
{
private:
pthread_mutex_t cnt_mutex;
pthread_cond_t rw_cond;
int rd_cnt, wr_cnt;
RWLock(constRWLock&);
RWLock&operator=(constRWLock&);
public:
RWLock(): rd_cnt(0),wr_cnt(0)
{
pthread_mutex_init(&cnt_mutex, NULL);

pthread_cond_init(&rw_cond, NULL);
}
void get_shared_lock()
{
pthread_t tag = pthread_self();
pthread_mutex_lock(&cnt_mutex);
rd_cnt++;
time_t now = time(NULL);
printf("[%lu]r_lock[thread_0x%x] r=%d w=%d\n", now,(int)tag, rd_cnt, wr_cnt);
while(wr_cnt >0)
{
printf
("\t\t r_lock wait for wr_cnt[%d]\n", wr_cnt);
pthread_cond_wait(&rw_cond,&cnt_mutex);
}
pthread_mutex_unlock(&cnt_mutex);
}
void release_shared_lock()
{
pthread_t tag = pthread_self();
pthread_mutex_lock(&cnt_mutex);
rd_cnt--;
time_t now = time(NULL);
printf("[%lu]r_unlock[thread_0x%x] r=%d w=%d\n", now,(int)tag, rd_cnt, wr_cnt);
if(0== rd_cnt)
{
printf("\t\t r_unlock[thread_0x%x] rd_cnt=0, so singal to wr_cnt[%d]\n",(int)tag, wr_cnt);
pthread_cond_signal(&rw_cond);
}
pthread_mutex_unlock(&cnt_mutex);
}
void get_exclusive_lock()
{
pthread_t tag = pthread_self();
pthread_mutex_lock(&cnt_mutex);
wr_cnt++;
time_t now = time(NULL);
printf("=====[%lu]w_lock[thread_0x%x] r=%d w=%d\n", now,(int)tag, rd_cnt, wr_cnt);
while(rd_cnt+wr_cnt>=2)
{
printf("\t\t w_lock wait r=%d w=%d\n", rd_cnt, wr_cnt);
pthread_cond_wait(&rw_cond,&cnt_mutex);
}
printf("=====\t\t w_lock[thread_0x%x] get ok r=%d w=%d\n",(int)tag, rd_cnt, wr_cnt);
pthread_mutex_unlock(&cnt_mutex);
}
void release_exclusive_lock()
{
pthread_t tag = pthread_self();
pthread_mutex_lock(&cnt_mutex);
wr_cnt--;
time_t now = time(NULL);
printf("=====[%lu]w_unlock[thread_0x%x] r=%d w=%d, then broadcast\n", now,(int)tag, rd_cnt, wr_cnt);
pthread_cond_broadcast(&rw_cond);
pthread_mutex_unlock

相關推薦

零基礎學python-3.7 還有一個程序 python文本

efi == put ret mode nbsp inpu exce for each 今天我們引入另外一個程序,文件的讀寫 我們先把簡單的程序代碼貼上。然後通過我們多次的改進。希望最後可以變成一個簡單的文本編輯器 以下是我們最簡單的代碼: ‘crudfile--讀寫文

C++利用一個fstream流檔案

原文地址:https://blog.csdn.net/qq_34176290/article/details/80260377 fstream物件可以同時具有ifstream和ofstream的功能,嘗試使用一個流對檔案進行讀寫的程式碼如下:

C#操作明華澳漢M1卡往扇區塊寫入讀取值小結

    近期因為專案中需要用到往IC卡的扇區塊中寫入值 並讀取值,並且是漢字。官方給的demo示例不是很規範,過程也有很多坑。先總結如下: 1、調整mifareone類中寫入的函式引用 最後一個寫入的文字引數由原 改為:    因為根據幫助文件,寫

Unity 加密xml

開發unity的過程中有不斷進行沙盒讀取操作,每次操作都需要進行一堆程式碼書寫,並且容易暴露資料,在這裡進行封裝一個類進行方便沙盒讀寫和進行加密 直接貼程式碼 /// <summary> /// ***作者:黛墨*** ///*** 時間:2018-9-16*

一個實現與使用(優先,C++實現

參考網上資料,實現了一個讀寫鎖,寫優先。使用起來也很簡單。 使用: //先定義一個全域性鎖物件 tg_rwlock g_rwlock; void test() { { tg_rwlock::read_guard(g_rwlock); //讀....

一個優先實現

/* g++ -Wall -o rwlock rwlock.cpp -lpthread * * 一個寫優先讀寫鎖的實現,多執行緒頻繁讀,多執行緒少量寫,同時寫優先,效能極佳。 * 當寫鎖(獨佔鎖)lock成功的必要條件是: * 1. 將寫鎖計數++; * 2

c++11實現優先

先直接貼出程式碼: #ifndef __WRITE_FIRST_RW_LOCK_H #define __WRITE_FIRST_RW_LOCK_H #include <mutex> #include <condition_variable> cl

程式設計:c++11基於atomic實現共享(優先)

在多執行緒狀態下,對一個物件的讀寫需要加鎖,基於CAS指令的原子語句可以實現高效的執行緒間協調。關於CAS的概念參見下面的文章: 在c++11中CAS指令已經被封裝成了 非常方便使用的atomic模板類, 詳情參見: 以下程式碼利用atomic實現了

Linux使用互斥和條件變數實現優先

(1)只要沒有執行緒持有某個給定的讀寫鎖用於寫,那麼任意數目的執行緒可以持有該讀寫鎖用於讀(2)僅當沒有執行緒持有某個讀寫鎖用於讀或用於寫時,才能分配該讀寫鎖用於寫換一種說法就是,只要沒有執行緒在修改(寫)某個給定的資料,那麼任意數目的執行緒都可以擁有該資料的訪問權(讀)。僅

實現一個快取系統

package cn.itcast.gz;   import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReentrantReadWriteLock;   /**  * 用讀寫鎖實現的一個快取系統,讀

自旋和順序實現原理

並且 保護 表達 min 返回 create creat rwlock ini 常用的同步原語鎖,到多核處理器時代鎖已經是必不可少的同步方式之一了。無論設計多優秀的多線程數據結構,都避不開有競爭的臨界區,此時高效的鎖顯得至關重要。鎖的顆粒度是框架/程序設計者所關註的,

模板方法模式 + 觀察者模式 + 簡單工廠模式 + 單例模式實現一個簡單的數據表

private 數據庫鏈 obs imp 通知 model 數據表 ring pri 實現功能: 對數據表的讀要緩存起來,對數據表的寫需要清除緩存. 數據表根據屬性字段來決定是否緩存 可以更換數據庫鏈接方式,比如可以隨時更換為mysql或mysqli() 當插入數據時給出一

MySQL中的事務及實現並發訪問控制

hang dea 執行c 定時 ack 幫助 持久 表操作 查看 一、並發控制中鎖的概念   鎖是並發控制中最核心的概念之一,在MySQL中的鎖分兩大類,一種是讀鎖,一種是寫鎖,讀鎖也可以稱為共享鎖(shared lock),寫鎖也通常稱為排它鎖(exclusive loc

linux下用互斥和條件變數來實現

以下內容來源自UNP卷二的第八章 讀寫鎖的概念( the conception of read-write lock ) (1)只要沒有執行緒持有某個給定的讀寫鎖用於寫,那麼任意數目的執行緒可以持有該執行緒用於讀 (2)僅當沒有執行緒持有某個給定的讀寫鎖用於讀或用於寫,才能分配該

多執行緒學習筆記五之實現分析

目錄 簡介 讀寫狀態 讀鎖計數器 共享鎖的獲取 tryAcquireShared(int unused) doAcquireShared(int arg) 共享鎖的釋放 tryReleaseShared(int unus

java併發-Synchronized+CAS方式實現

Synchronized+CAS方式實現讀寫鎖 文章目錄 Synchronized+CAS方式實現讀寫鎖 思路 技術 程式碼 測試 結果 [GitHub主頁](https://gith

《Java併發程式設計的藝術》-Java併發包中的及其實現分析

1. 前言 在Java併發包中常用的鎖(如:ReentrantLock),基本上都是排他鎖,這些鎖在同一時刻只允許一個執行緒進行訪問,而讀寫鎖在同一時刻可以允許多個讀執行緒訪問,但是在寫執行緒訪問時,所有的讀執行緒和其他寫執行緒均被阻塞。讀寫鎖維護了一對鎖,一個讀鎖和一個寫鎖,通過分離讀鎖和

Linux中--優先

my_pthread_rwlock.h:#pragma once #include<pthread.h> #include<stdio.h> typedef struct { pthread_mutex_t rw_mutex; pt

ACE優先)測試及用法

在網路程式設計中多執行緒是一個必用一種技術,但是在初步學習多執行緒的時候很多人會遇到這樣或那樣的問題。多執行緒程式設計時,在有讀執行緒和寫執行緒併發的時候就需要讀寫鎖了。ACE的讀寫鎖機制完全可以解決這些問題。 ACE定義了四個巨集,也就是:ACE_WRITE_GUARD、

c++的跨平臺的實現

使用巨集區分win和linux下的鎖的實現。 標頭檔案 RWLock.h ////////////////////////////////////////////////////////////////////////// //讀寫鎖 //////////////////