讀者寫者模型

讀者寫者模型

  • 鎖類型 : 自旋鎖,一直佔用着CPU,在未獲得鎖的情況下,會一直自選的等待,如果不能在短時間內獲得鎖,會使CPU效率很低.
  • 應用場景 :
對於一塊公共資源來說,讀取的頻率比較高,但是寫的頻率很低.
通常而言,在讀的過程中,往往伴隨着查找的操作,中間消耗着大量的時長,如果給這種代碼加鎖,就會極大的降低我們的效率.
所以在讀的時候是不需要加鎖的,大家共享公共資源,但是不會修改,那麼就不存在數據讀錯的問題.
但是當有人要寫這個數據的時候,我們就必須要加鎖,爲了避免有讀者讀取到的數據不是當前修改過的數據.讀寫鎖就是爲了解決這樣的問題的.
  • 一個場景
這裏指一塊公共資源
  • 兩種角色
讀者 - 只讀取數據,不對數據進行修改
寫者 - 會修改數據內容
  • 三種關係
讀者 & 讀者 -> 共享
寫者 & 寫者 -> 互斥
讀者 & 寫者 - > 同步互斥

讀寫鎖接口

初始化
pthread_rwlock_init (pthread_rwlock_t * restrict  rwlock, const pthread_rwlockattr_t * restrict attr);

參數:
    rwlock : 讀寫鎖
    attr : NULL

銷燬
int pthread_rwlock_destroy(pthread_rwlock_t* rwlock);

加鎖和解鎖
int pthread_rwlock_rdlock(pthread_rwlock_t* rwlock);  // 加讀鎖
int pthread_rwlock_wrlock(pthread_rwlock_t* rwlock); // 加寫鎖

int pthread_rwlock_unlock(pthread_rwlock_t* rwlock); // 解鎖

代碼演示讀者寫者模型

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

pthread_rwlock_t rwlock; // 創建一個讀寫鎖

// 1. 一種場景
//    這裏使用一全局變量
int count = 0;

// 2. 兩種角色
// 3. 三種關係
void* Read(void* arg)
{
    (void)arg;
    while(1)
    {
        pthread_rwlock_rdlock(&rwlock);
        printf("begin read\n");
        printf("read : %d\n",count);
        printf("read done\n");
        pthread_rwlock_unlock(&rwlock);
        usleep(123456);
    }
    return NULL;
}

void* Write(void* arg)
{
    (void)arg;
    while(1)
    {
        pthread_rwlock_rdlock(&rwlock);
        printf("begin write\n");
        printf("write : %d\n",++count);
        printf("write done\n");
        pthread_rwlock_unlock(&rwlock);
        usleep(987654);
    }
    return NULL;
}

int main()
{
    pthread_rwlock_init(&rwlock,NULL);

    pthread_t reader[4], writer[2];
    int i = 0;
    for(i = 0; i < 4; ++i)
    {
        pthread_create(&reader[i],NULL,Read,NULL);
    }
    for(i = 0; i < 2; ++i)
    {
        char buf[32] = {0};
        sprintf(buf,"writer %d",i);
        pthread_create(&writer[i],NULL,Write,NULL);
    }

    for(i = 0; i < 4; ++i)
    {
        if(i < 2)
        {
            pthread_join(writer[i],NULL);
        }
        pthread_join(reader[i],NULL);
    }

    pthread_rwlock_destroy(&rwlock);
    return 0;
}

結果演示:


發佈了77 篇原創文章 · 獲贊 50 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章