读共享,写独占

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. Basic Messager

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. 推荐一份 Google 面试指南

    经常有不少读者在我公众号后台留言,说自己还是应届毕业生,缺乏工作经验与项目经验,不知道如何才能通过面试? 其实,项目经验固然重要,但是企业也知道,对于应届毕业生,是很难有拿得出手的项目经验出来的,毕竟 ...

  3. 深度学习教程Deep Learning Tutorials

    Deep Learning Tutorials Deep Learning is a new area of Machine Learning research, which has been int ...

  4. OpenERP|odoo Web开发

    在OpenERP 7 和 Odoo 8下测试均可. 1.相关库/框架 主要:jQuery(使用1.8.3,如果使用新版本,其他jQuery插件也要升级或修改).Underscore.Qweb 其他:都 ...

  5. microsoft visual c++与microsoft visual net 版本对应关系

    7.1 -> 2003 8.0 -> 2005 9.0 -> 2008 10.0 -> 2010 11.0 -> 2012 12.0 -> 2013 14.0 -& ...

  6. Android Logger日志系统

    文件夹 文件夹 前言 执行时库层日志库liblog 源代码分析 CC日志写入接口 Java日志写入接口 logcat工具分析 基础数据结构 初始化过程 日志记录的读取过程 前言 该篇文章是我的读书和实 ...

  7. Hadoop I/O

    Hadoop自带一套原子操作用于数据I/O.当中一些技术,如数据完整性保持和压缩,对于处理多达数个TB的数据时.特别值得关注.另外一些Hadoop工具或API.所形成的构建模块可用于开发分布式系统.比 ...

  8. SVM训练结果参数说明 训练参数说明 归一化加快速度和提升准确率 归一化还原

    原文:http://blog.sina.com.cn/s/blog_57a1cae80101bit5.html 举例说明 svmtrain -s 0 -?c 1000 -t 1 -g 1 -r 1 - ...

  9. 关于DrawIndexedPrimitive函数的调用

    函数的原型例如以下所看到的: HRESULT DrawIndexedPrimitive( [in] D3DPRIMITIVETYPE Type, [in] INT BaseVertexIndex, [ ...

  10. 在centOS上安装VNC

    步骤如下: 1.搜寻VNC Server [root@msg45 wasliberty]# yum search tigervnc-serverLoaded plugins: fastestmirro ...