读共享,写独占

pthread_rwlock_t
pthread_rwlock_init
pthread_rwlock_destroy
pthread_rwlock_rdlock
pthread_rwlock_wrlock
pthread_rwlock_tryrdlock
pthread_rwlock_trywrlock
pthread_rwlock_unlock

示例代码:

#include <pthread.h>
#include <stdio.h>
#include <unistd.h> static int counter;
static pthread_rwlock_t rwlock; void *th_write(void *arg)
{
int t, i;
for (i=; i<; i++) {
pthread_rwlock_wrlock(&rwlock);
t = counter;
usleep();
printf("Write Thread(%x) counter=%d, ++counter=%d\n", (int)pthread_self(), t, ++counter);
pthread_rwlock_unlock(&rwlock);
usleep();
} } void *th_read(void *arg)
{
while() {
pthread_rwlock_rdlock(&rwlock);
printf("Read Thread(%x) counter=%d\n", (int)pthread_self(), counter);
pthread_rwlock_unlock(&rwlock);
usleep();
}
} int main()
{
int i;
pthread_t tid[]; pthread_rwlock_init(&rwlock, NULL);
for (i=; i<; i++)
pthread_create(&tid[i], NULL, th_write, NULL);
for (i=; i<; i++)
pthread_create(&tid[i+], NULL, th_read, NULL);
for (i=; i<; i++)
pthread_join(tid[i], NULL); pthread_rwlock_destroy(&rwlock);
return ;
}

运行结果:

Read Thread(f901e700) counter=0
Read Thread(f981f700) counter=0
Read Thread(f881d700) counter=0
Read Thread(fa020700) counter=0
Read Thread(fa821700) counter=0
Write Thread(fb022700) counter=0, ++counter=1
Write Thread(fb823700) counter=1, ++counter=2
Write Thread(fc024700) counter=2, ++counter=3
Write Thread(fb022700) counter=3, ++counter=4
Write Thread(fb823700) counter=4, ++counter=5
Write Thread(fc024700) counter=5, ++counter=6
Write Thread(fb022700) counter=6, ++counter=7
Write Thread(fb823700) counter=7, ++counter=8
Write Thread(fc024700) counter=8, ++counter=9
Write Thread(fb022700) counter=9, ++counter=10
Write Thread(fb823700) counter=10, ++counter=11
Write Thread(fc024700) counter=11, ++counter=12
Write Thread(fb022700) counter=12, ++counter=13
Write Thread(fb823700) counter=13, ++counter=14
Write Thread(fc024700) counter=14, ++counter=15
Read Thread(f901e700) counter=15
Read Thread(f981f700) counter=15
Read Thread(f881d700) counter=15
Read Thread(fa020700) counter=15
Read Thread(fa821700) counter=15
Read Thread(f901e700) counter=15
Read Thread(f981f700) counter=15
Read Thread(f881d700) counter=15
Read Thread(fa020700) counter=15

...

线程相关函数(5)-pthread_rwlock_rdlock(),pthread_rwlock_wrlock() 读写锁的更多相关文章

  1. JUC——线程同步锁(ReentrantReadWriteLock读写锁)

    读写锁简介 所谓的读写锁值得是两把锁,在进行数据写入的时候有一个把“写锁”,而在进行数据读取的时候有一把“读锁”. 写锁会实现线程安全同步处理操作,而读锁可以被多个对象读取获取. 读写锁:ReadWr ...

  2. linux c 线程相关函数

    线程相关函数(1)-pthread_create(), pthread_join(), pthread_exit(), pthread_cancel() 创建取消线程 一. pthread_creat ...

  3. Linux线程同步之读写锁(rwlock)

    读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程.当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步, 和 ...

  4. 嵌入式 Linux线程同步读写锁rwlock示例

    读写锁比mutex有更高的适用性,可以多个线程同时占用读模式的读写锁,但是只能一个线程占用写模式的读写锁.1. 当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞:2. ...

  5. Linux程序设计学习笔记----多线程编程线程同步机制之相互排斥量(锁)与读写锁

    相互排斥锁通信机制 基本原理 相互排斥锁以排他方式防止共享数据被并发訪问,相互排斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个相互排斥锁逻辑上绑定之后,对该资源的訪问操作例如以下: ...

  6. UNIX环境高级编程——线程同步之读写锁以及属性

    读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程.当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步, 互 ...

  7. Linux:使用读写锁使线程同步

    基础与控制原语 读写锁 与互斥量类似,但读写锁允许更高的并行性.其特性为:写独占,读共享. 读写锁状态: 一把读写锁具备三种状态:     1. 读模式下加锁状态 (读锁)     2. 写模式下加锁 ...

  8. linux线程间同步(1)读写锁

    读写锁比mutex有更高的适用性,能够多个线程同一时候占用读模式的读写锁.可是仅仅能一个线程占用写模式的读写锁. 1. 当读写锁是写加锁状态时,在这个锁被解锁之前,全部试图对这个锁加锁的线程都会被堵塞 ...

  9. linux c编程:读写锁

    什么是读写锁读写锁其实还是一种锁,是给一段临界区代码加锁,但是此加锁是在进行写操作的时候才会互斥,而在进行读的时候是可以共享的进行访问临界区的 为什么需要读写锁有时候,在多线程中,有一些公共数据修改的 ...

随机推荐

  1. zendframework配置篇

    1. 重写配置 httpd.conf配置修改 LoadModule rewrite_module modules/mod_rewrite.so <Directory "D:\PHPPr ...

  2. SIGSEGV异常时打印函数调用链

    C语言写的程序跑飞了,怎样打印出函数调用链呢? linux_dev_framework软件包中的trace_exception_test.c就是一个实现演示样例. 该程序有益产生一个内存訪问异常,然后 ...

  3. Struts2典型应用

    1. Struts2处理表单数据 例1.1 创建Java Web项目,编写一个Action对象,处理对表单提交的数据,模拟实现对指定用户的问候. (1)创建Java Web项目,将Struts的支持类 ...

  4. HTML:基本的标签

    概述: <html></html>标准的语言格式,回环标签,有头和躯体部分,头里面一般显示标题title,躯体部分显示内容:背景色.文字.图片.超链接.表格.表单等. 可以直接 ...

  5. CentOS7下命令安装火狐浏览器

    使用命令安装火狐浏览器,需要切换root(su root)下,执行下面的命令,自动下载所需依赖包,完成安装 yum -y install firefox 然后重启即可

  6. 环境变量之执行文件路径的变量PATH

    当我们执行一个命令时,系统会依据PATH的设置去PATH定义的每个目录下查寻该命令的可执行文件,如果在PATH定义的目录中含有多个文件名为我们要执行的命令的可执行文件时,那么先查询到的同名命令先被执行 ...

  7. unity3d 自带截屏

    Application.CaptureScreenshot("Screenshot.png"); 截屏后的文件所在路径:Application.persistentDataPath

  8. android中获取某段程序的执行时间

    Date   startDate   =   new   Date(System.currentTimeMillis()); 在收到设备返回数据之后添加如下语句: Date   endDate   = ...

  9. JavaWeb 调用接口

      JavaWeb 如何调用接口 CreateTime--2018年4月2日19:04:29 Author:Marydon 1.所需jar包 2.代码设计 WebUtils.java import j ...

  10. Linux内核开发之异步通知与异步I/O(一)

    “小王,听说过锦上添花吧..”我拍拍下王的头说. “还锦上添花你,为你上次提的几个东东,我是头上长包..”小王气愤地瞪着我. “啊,为啥这样呢,本来还特意拒绝了MM的月份,抽出时间打算给你说点高级的东 ...