c语言读写锁,POSIX读写锁 - zy010101的个人空间 - OSCHINA - 中文开源技术交流社区

本文介绍了读写锁的概念,它允许多个线程同时读取资源,但写入时互斥,从而提高并发性。在POSIX环境下,展示了读写锁的初始化、加锁和解锁函数。通过一个示例程序,演示了读写锁如何在多个读线程和写线程中工作,确保写线程的优先级高于读线程。
摘要由CSDN通过智能技术生成

本文讲述读写锁。读写锁和互斥量不太一样,它允许锁可以是读加锁,写加锁以及未加锁三种状态。每次只能由一个线程处于写加锁状态,但是可以有多个线程处于读加锁状态。

读写锁是一把锁,不是两把锁。它就像是多路开关一样。当锁处于写加锁状态时,所有其他试图对这个锁进行读加锁或者写加锁的线程都会被阻塞;当锁处于读加锁状态时,所有试图对这个锁进行读加锁的线程头可以得到访问权,而所有试图对这个锁进行写加锁的线程都会被阻塞。

读写锁很明显带来了比互斥量更高的并发性。并且读写锁非常适合读取比写入操作更多的情况。有的教材会把读写锁也称为“共享互斥锁”。当读写锁以写模式锁住,称之为“共享模式锁住”;而当读写锁以读模式锁住,称之为“互斥模式锁住”。

下面是供我们在POSIX下进行读写锁初始化和反向初始化的函数。

566d54356f081793b04259bf6874a085.png

下面是与写加锁的函数。

9690d925320b87d9dd1e3e203c5c951f.png

下面是与读加锁的函数。

64cbb7d2d80c9d0d59c9ec429b3884c7.png

由于读写锁是一把锁,因此在解锁的时候无论你是读加锁,还是写加锁,都是使用下面的解锁函数。

3f028087700a5371e41a9d02ea901ef1.png

#include

#include

#include

#include

#include

char str[30]; //共享资源

pthread_rwlock_t rwlock; //读写锁

void *th_write(void *arg)

{

usleep(300); //延时

pthread_rwlock_wrlock(&rwlock);

strcpy(str,"123");

pthread_rwlock_unlock(&rwlock);

pthread_exit(NULL);

}

void *th_read(void *arg)

{

pthread_rwlock_rdlock(&rwlock);

printf("read: %s\n",str);

pthread_rwlock_unlock(&rwlock);

pthread_exit(NULL);

}

int main(void)

{

int i;

pthread_t tid[8];

strcpy(str,"Hello World!");

pthread_rwlock_init(&rwlock, NULL); //初始化锁

for (i = 0; i<3; i++) //3和写线程

pthread_create(&tid[i], NULL, th_write, NULL);

for (i = 0; i<5; i++) //5个读线程

pthread_create(&tid[i+3], NULL, th_read, NULL);

for (i = 0; i<8; i++) //等待线程结束,回收线程

pthread_join(tid[i], NULL);

pthread_rwlock_destroy(&rwlock); //销毁锁

return 0;

}

运行结果如下:

27886d238c9e8f8444da4c0618f6f170.png

可以看到,可以多个读线程去访问读加锁的资源。并且写加锁只能被某个线程独自访问。其余线程都在阻塞。并且等待线程中的写加锁线程比读加锁线程优先级高。

总结一下:

读共享,写独享;写必读优先级高。

本文同步分享在 博客“zy010101”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值