linux下读写锁的操作,设置写优先模式

//读写锁测试程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>

//定义一个全局变量
int number = 0;
//定义一把读写锁
pthread_rwlock_t rwlock;
pthread_rwlockattr_t rwLockAttr;

//写线程回调函数
void * thread_write(void *arg){
        int i = *(int *)arg;
        int cur;
        while(1){
                //加写锁
		    printf("[%d]-wait write! \n",i);
                pthread_rwlock_wrlock(&rwlock);
                cur = number;
                cur++;
		    sleep(0.5);
                number = cur;
                printf("[%d]-W:[%d]\n",i,cur);
                //解锁
                pthread_rwlock_unlock(&rwlock);
                //sleep(rand()%3);
		   sleep(3);
        }
}

//读线程回调函数
void *thread_read(void *arg){
        int i = *(int *)arg;
        int cur;
        while(1){
                //加读锁
                pthread_rwlock_rdlock(&rwlock);
                cur = number;
                printf("[%d]-R:[%d]\n",i,cur);
		    sleep(2);
                //解锁
                pthread_rwlock_unlock(&rwlock);
                //sleep(3);
        }

}

int main(){
        int n = 8;
        int i =0;
        int arr[8];
        //定义线程 id
	printf("PTHREAD_RWLOCK_PREFER_READER_NP = %d\n",PTHREAD_RWLOCK_PREFER_READER_NP);
	printf("PTHREAD_RWLOCK_PREFER_WRITER_NP = %d\n",PTHREAD_RWLOCK_PREFER_WRITER_NP);
	printf("PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP = %d\n",PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
        pthread_t thread[8];
    	if(pthread_rwlockattr_init(&rwLockAttr)!=0)
    	{
    	    printf("init rwlockattr attribute is failed ! erro reason is %s!\n",strerror(errno));
   	     exit(0);
    	}
        //初始化读写锁
	pthread_rwlockattr_setkind_np(&rwLockAttr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
        pthread_rwlock_init(&rwlock,&rwLockAttr);
	//pthread_rwlock_init(&rwlock,NULL);
	


        //创建是哪个写锁
        for(i=0;i<3;i++){
                arr[i] = i;
                //创建写线程
                pthread_create(&thread[i],NULL,thread_write,&arr[i]);
        }
        //创建5个读线程
        for(i=3;i<n;i++){
                arr[i] = i;
                //创建读线程
                pthread_create(&thread[i],NULL,thread_read,&arr[i]);
        }
        //回收子线程
        int j = 0;
        for(j=0;j<n;j++){
                pthread_join(thread[j],NULL);
        }
        //释放锁
        pthread_rwlock_destroy(&rwlock);
        return 0;
}

enum

{

PTHREAD_RWLOCK_PREFER_READER_NP, //读者优先(默认属性)

PTHREAD_RWLOCK_PREFER_WRITER_NP, //读者优先

PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, //写者优先

PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_READER_NP //读者优先

};

1

/* 获取与设置属性 */int pthread_rwlockattr_getkind_np(const pthread_rwlockattr_t * attr, int * pref);int pthread_rwlockattr_setkind_np(pthread_rwlockattr_t * attr, int * pref);

理论:https://www.cnblogs.com/blackandwhite/p/12447522.html

实践:https://blog.csdn.net/weixin_43841155/article/details/127304105

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值