当前位置: 首页 > 后端技术 > PHP

计算机操作系统基础(十三)---线程同步读写锁

时间:2023-03-29 17:53:44 PHP

介绍国内有两篇文章介绍了互斥锁和自旋锁两种方法。读写锁的原理和前面两种锁类似,但是读写锁做了一些改进。读写锁的改进从以下几点考虑,其中最重要的是对临界资源的考虑。在复杂的开发环境中,很可能对关键资源的读多写少。比如数据库中的一张表,主要存放一些历史数据。这些历史数据一般都是查询的,很少修改。那么存储历史数据的表就是一个读多写少的关键资源。读取时不会改变临界资源的值。如果每次读写都加锁,效率很低。那么这个时候,你就应该考虑有没有更高效的方法呢?这时候就产生了读写锁和读写锁。读写锁的引入是一种特殊的自旋锁,可以让多个读者同时访问资源,提高读性能。写操作是互斥的(不允许多个写操作同时访问同一个资源)关于读写锁的模型对于读写锁来说,它允许多个读者同时读取临界资源,所以下图中的读线程1、2、3可以同时读取临界资源,但是在读的同时,不会让写操作访问临界资源。因为读不会改变临界资源,而写操作可能会改变临界资源的值,所以读和写在读写锁中是互斥的,读和读之间存在非互斥的读写锁。例子#include#include#include#include#include//临界资源intnum=0;//定义读写锁pthread_rwlock_trelock=PTHREAD_RWLOCK_INITIALIZER;void*reader(void*){inttimes=10000000;while(times--){//读操作前加读锁pthread_rwlock_rdlock(&rdlock);if(times%1000==0){usleep(10);}//释放读锁pthread_rwlock_unlock(&rdlock);}}void*writer(void*){inttimes=10000000;while(times--){//添加写锁pthread_rwlock_wrlock(&rdlock);数+=1;pthread_rwlock_unlock(&??rdlock);}}intmain(){printf("从主函数开始。");//定义三个线程pthread_tthread1,thread2,thread3;//两次读操作和一次写操作pthread_create(&thread1,NULL,&reader,NULL);pthread_create(&thread2,NULL,&reader,NULL);pthread_createe(&thread3,NULL,&writer,NULL);pthread_join(&thread1,NULL);pthread_join(&thread2,NULL);pthread_join(&thread3,NULL);//打印关键资源的值printf("在main函数中打印:num=%d\n",num);return0;}上面说过,读写锁在读多写少的情况下会有明显的性能提升。这时候可以验证一下,运行上面使用的读写锁写锁程序,查看运行时间如下:现在把读写锁换成互斥量,再看执行时间#include#include#include#include#include//关键资源intnum=0;//初始化mutexpthread_mutex_tmutex=PTHREAD_MUTEX_INITIALIZER;//定义读写锁//pthread_rwlock_trelock=PTHREAD_RWLOCK_INITIALIZER;void*reader(void*){inttimes=10000000;while(times--){//读操作前加读锁//pthread_rwlock_rdlock(&rdlock);pthread_mutex_lock(&mutex);if(times%1000==0){usleep(10);}//释放读锁//pthread_rwlock_unlock(&rdlock);pthread_mutex_unlock(&mutex);}}void*writer(void*){int次=10000000;while(times--){//添加写锁//pthread_rwlock_wrlock(&rdlock);pthread_mutex_lock(&mutex);数+=1;//pthread_rwlock_unlock(&rdlock);pthread_mutex_unlock(&mutex);}}intmain(){printf("从主函数开始。");//定义三个线程pthread_tthread1,thread2,thread3;//两次读操作和一次写操作pthread_create(&thread1,NULL,&reader,NULL);pthread_create(&thread2,NULL,&reader,NULL);pthread_create(&thread3,NULL,&writer,NULL);pthread_join(&thread1,NULL);pthread_join(&thread2,NULL);pthread_join(&thread3,NULL);//打印关键资源的值printf("在main函数中打印:num=%d\n",num);return0;}执行结果:可以看出,对于读多写少的关键资源,使用读写锁的效率是使用互斥锁的5倍左右PHP中文读写锁相关API:https://www.php.net/manual/zh...在瞬息万变的技术中寻找相同点,是一个技术人的核心竞争力。知行合一,理论联系实际