Linux使用互斥鎖和條件變數實現讀寫鎖(寫優先)

2021-08-17 17:27:51 字數 2237 閱讀 3708

(1)只要沒有執行緒持有某個給定的讀寫鎖用於寫,那麼任意數目的執行緒可以持有該讀寫鎖用於讀

(2)僅當沒有執行緒持有某個讀寫鎖用於讀或用於寫時,才能分配該讀寫鎖用於寫

換一種說法就是,只要沒有執行緒在修改(寫)某個給定的資料,那麼任意數目的執行緒都可以擁有該資料的訪問權(讀)。僅當沒有其它執行緒在讀或者修改(寫)某個給定的資料時,當前執行緒才可以修改(寫)它。

因此,讀為共享,寫為獨佔。

本程式只實現了一種可能,即優先考慮等待著的寫入者,可有其他實現方案。

//my_pthread_rwlock.h

#pragma once

#include#includetypedef struct

my_pthread_rwlock_t;

#define rw_magic 0x20180326

#define ebusy 22

#define my_pthread_rwlock_initializer

typedef int my_pthread_rwlockattr_t;

int my_pthread_rwlock_init(my_pthread_rwlock_t *rw, my_pthread_rwlockattr_t *attr);

int my_pthread_rwlock_destroy(my_pthread_rwlock_t *rw);

int my_pthread_rwlock_rdlock(my_pthread_rwlock_t *rw);

int my_pthread_rwlock_wrlock(my_pthread_rwlock_t *rw);

int my_pthread_rwlock_unlock(my_pthread_rwlock_t *rw);

int my_pthread_rwlock_tryrdlock(my_pthread_rwlock_t *rw);

int my_pthread_rwlock_trywrlock(my_pthread_rwlock_t *rw);

//my_pthread_rwlock.c

#include"my_pthread_rwlock.h"

#includeint my_pthread_rwlock_init(my_pthread_rwlock_t *rw, my_pthread_rwlockattr_t *attr)

int my_pthread_rwlock_rdlock(my_pthread_rwlock_t *rw)

if(result == 0)

rw->rw_refcount++;

pthread_mutex_unlock(&rw->rw_mutex);

return result;

}int my_pthread_rwlock_wrlock(my_pthread_rwlock_t *rw)

if(result == 0)

rw->rw_refcount = -1;

pthread_mutex_unlock(&rw->rw_mutex);

return result;

}int my_pthread_rwlock_unlock(my_pthread_rwlock_t *rw)

}else if(rw->rw_nwaitreaders > 0)

result = pthread_cond_broadcast(&rw->rw_condreaders);

pthread_mutex_unlock(&rw->rw_mutex);

return result;

}int my_pthread_rwlock_tryrdlock(my_pthread_rwlock_t *rw)

int my_pthread_rwlock_trywrlock(my_pthread_rwlock_t *rw)

int my_pthread_rwlock_destroy(my_pthread_rwlock_t *rw)

#include#include#include#include"my_pthread_rwlock.h"

my_pthread_rwlock_t rwlock = my_pthread_rwlock_initializer;

void * thread_fun1(void *arg)

void * thread_fun2(void *arg)

void * thread_fun3(void *arg)

int main()

linux互斥鎖和條件變數

一 互斥鎖 1.初始化 在linux下,執行緒的互斥量資料型別是pthread mutex t.在使用前,要對它進行初始化 對於靜態分配的互斥量,可以把它設定為pthread mutex initializer,或者呼叫pthread mutex init.對於動態分配的互斥量,在申請記憶體 mal...

Linux互斥鎖和條件變數

include class thread lock thread lock void lock void unlock void wait void signal private pthread mutex t m mutex pthread mutexattr t m mutexatr pthre...

互斥鎖和條件變數

互斥瑣 定義 指代相互排斥,最基本的同步形式。用於保護臨界區,以保證任何時刻只有乙個執行緒或乙個程序在執行其中的 上鎖 pthread mutex lock 臨界區解鎖 pthread mutex unlock 條件變數 定義 用於等待訊號,同步的另一種手段。每乙個條件變數總有乙個互斥瑣與之關聯。等...