读写锁的基本理解及简单用法
来源:互联网 发布:end.js 编辑:程序博客网 时间:2024/06/05 02:59
一、基础知识
Pthread是 POSIX threads 的简称,是POSIX的线程标准。
pthread读写锁把对共享资源的访问者分为读者和写者,读者只对共享资源进行读访问,写者只对共享资源进行写操作。在互斥机制,读者和写者都需要独立独占互斥量以独占共享资源,在读写锁机制下,允许同时有多个读者读访问共享资源,只有写者才需要独占资源。相比互斥机制,读写机制由于允许多个读者同时读访问共享资源,进一步提高了多线程的并发度。
1.读写锁机制:
写者:写者使用写锁,如果当前没有读者,也没有其他写者,写者立即获得写锁;否则写者将等待,直到没有读者和写者。
读者:读者使用读锁,如果当前没有写者,读者立即获得读锁;否则读者等待,直到没有写者。
2.读写锁特性:
同一时刻只有一个线程可以获得写锁,同一时刻可以有多个线程获得读锁。
读写锁出于写锁状态时,所有试图对读写锁加锁的线程,不管是读者试图加读锁,还是写者试图加写锁,都会被阻塞。
读写锁处于读锁状态时,有写者试图加写锁时,之后的其他线程的读锁请求会被阻塞,以避免写者长时间的不写锁。
3.读写锁基本函数:
# include<pthread.h>
读写锁初始化:
int pthread_rwlock_init(pthread_rwlock_t * rwlock,
const pthread_rwlockattr_t * attr);
该函数第一个参数为读写锁指针,第二个参数为读写锁属性指针。函数按读写锁属性对读写锁进行初始化。
加读锁:
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
该函数参数为读写锁指针。函数用于对读写锁加读锁。
加写锁:
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
该函数参数为读写锁指针。函数用于对读写锁加写锁。
释放读写锁:
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
该函数参数为读写锁指针。函数用于释放读写锁,包括读锁与写锁。
销毁读写锁:
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
该函数参数为读写锁指针。函数用于销毁读写锁。
二、需要材料:
1.pthreads-w32-2-8-0-release.exe
下载:ftp://sourceware.org/pub/pthreads-win32
三、操作步骤:
1.VS2008新建控制台项目
#include <stdio.h>#include <Windows.h>#include <pthread.h>#include <semaphore.h>#pragma comment(lib, "pthreadVC2.lib") //必须加上这句pthread_t t1; //pthread_t变量t1,用于获取线程1的IDpthread_t t2; //pthread_t变量t2,用于获取线程2的IDpthread_rwlock_t rwlock; //声明读写锁int data=1; //共享资源void* readerM(void* arg){while(1){pthread_rwlock_rdlock(&rwlock); //读者加读锁printf("M 读者读出: %d \n",data); //读取共享资源pthread_rwlock_unlock(&rwlock); //读者释放读锁Sleep(1200);}return NULL;}void* readerN(void* arg){while(1){pthread_rwlock_rdlock(&rwlock);printf(" N读者读出: %d \n",data);pthread_rwlock_unlock(&rwlock);Sleep(700);}return NULL;}void* writerA(void* arg){while(1){pthread_rwlock_wrlock(&rwlock); //写者加写锁data++; //对共享资源写数据printf("A写者写入: %d\n",data);pthread_rwlock_unlock(&rwlock); //释放写锁Sleep(2000);}return NULL;}void* writerB(void* arg){while(1){pthread_rwlock_wrlock(&rwlock);data++;printf("B写者写入: %d\n",data);pthread_rwlock_unlock(&rwlock);Sleep(2000);}return NULL;}int main(){pthread_rwlock_init(&rwlock, NULL); //初始化读写锁pthread_create(&t1,NULL,readerM,NULL);pthread_create(&t1,NULL,readerN,NULL);pthread_create(&t2,NULL,writerA,NULL);pthread_create(&t2,NULL,writerB,NULL);pthread_rwlock_destroy(&rwlock); //销毁读写锁Sleep(10000000);return 0;}
2.双击pthreads-w32-2-8-0-release.exe,点击Browse选择安装到的目录,然后点击Extract解压,完成后点击Done
3.将Pre-built.2文件夹下的include和lib文件夹里的文件复制到VS2008对应的include和lib目录
4.运行结果:
1 0
- 读写锁的基本理解及简单用法
- 理解Vue 2.0 的ref属性及简单用法
- Java NIO 的简单读写 以及理解
- Android AsyncTask理解及简单用法
- 对GCD简单理解及用法
- sscanf的基本简单用法
- 基本文件读写及简单停用词处理
- qt5文件读写的简单用法
- NSUserDefaults 的理解及用法
- java中读写锁的实现及使用读写锁简单实现缓存系统的实例
- java中读写锁的实现及使用读写锁简单实现缓存系统的实例
- java中读写锁的实现及使用读写锁简单实现缓存系统的实例
- Java中读写锁的实现及使用读写锁简单实现缓存系统的实例
- linux读写锁的理解
- mysql 读写锁的理解
- linux读写锁的理解
- make工程管理器的基本理解及简单计算器Makefile模板
- 利用C/C++库函数读写文件的基本用法
- 2016-11-19
- 我回来咯
- VERILOG的parameter的写法
- 栈——括号匹配
- 实验六
- 读写锁的基本理解及简单用法
- C++ STL 仿函数使用
- {小结}NOIP2016提高组腐赛
- C++ 指针再浅谈
- 数据库的语句(oracle)二
- 前端html与css学习笔记总结篇(超详细)
- 解决mysql-connector-java驱动编译时Dex cannot parse version 52 byte code...等错误
- codeforces 734C Anton and Making Potions
- 新生选拔赛暂存