多线程开发之读写锁
来源:互联网 发布:windows.old怎么使用 编辑:程序博客网 时间:2024/06/06 10:46
读写锁与互斥量类似,不过读写锁允许更高的并行,互斥量要么是锁住状态,要么是不加锁状态。而且一次只有一个线程可以对其枷锁。读写锁就不一样了,虽然一次只有一个线程可以占有写模式的读写锁,但是多个可以同时占有读模式的读写锁。
首先介绍:读锁,具体看代码:
#include <iostream>
#include<pthread.h>
#include<unistd.h>
using namespace std;
int glable_num=10;
pthread_rwlock_t lock;
void *read_fn(void *arg)
{
char *name=(char*)arg;
for(int i=0;i<5;i++)
{
pthread_rwlock_rdlock(&lock);
cout<<"come in:"<<glable_num<<":"<<name<<endl;
sleep(1);
cout<<"leave:"<<name<<endl;
pthread_rwlock_unlock(&lock);
sleep(1);
}
return ((void *)0);
}
void *write_fn(void *arg)
{
char *name=(char*)arg;
for(int i=0;i<5;i++)
{
pthread_rwlock_wrlock(&lock);
glable_num++;
cout<<"come in:"<<glable_num<<":"<<name<<endl;
sleep(1);
cout<<"leave:"<<name<<endl;
pthread_rwlock_unlock(&lock);
sleep(1);
}
return ((void *)0);
}
int main()
{
pthread_t read_1,read_2,write_1,write_2;
char *read1="read_1";
char *read2="read_2";
char *write1="write_1";
pthread_rwlock_init(&lock,NULL);
pthread_create(&read_1,NULL,read_fn,(void*)read1);
pthread_create(&read_2,NULL,read_fn,(void*)read2);
pthread_join(read_1,NULL);
pthread_join(read_2,NULL);
pthread_rwlock_destroy(&lock);
return 0;
}
从以上结果可以看出来,当有一个读锁加了之后,在加读锁是可以的。并不会阻塞,而是读锁1打开之后,读锁2打开,最后再是读锁1关闭,读锁2关闭。
写锁:具体看代码
#include <iostream>
#include<pthread.h>
#include<unistd.h>
using namespace std;
int glable_num=10;
pthread_rwlock_t lock;
void *read_fn(void *arg)
{
char *name=(char*)arg;
for(int i=0;i<5;i++)
{
pthread_rwlock_rdlock(&lock);
cout<<"come in:"<<glable_num<<":"<<name<<endl;
sleep(1);
cout<<"leave:"<<name<<endl;
pthread_rwlock_unlock(&lock);
sleep(1);
}
return ((void *)0);
}
void *write_fn(void *arg)
{
char *name=(char*)arg;
for(int i=0;i<5;i++)
{
pthread_rwlock_wrlock(&lock);
glable_num++;
cout<<"come in:"<<glable_num<<":"<<name<<endl;
sleep(1);
cout<<"leave:"<<name<<endl;
pthread_rwlock_unlock(&lock);
sleep(1);
}
return ((void *)0);
}
int main()
{
pthread_t read_1,read_2,write_1,write_2;
char *read1="read_1";
char *read2="read_2";
char *write1="write_1";
pthread_rwlock_init(&lock,NULL);
pthread_create(&read_1,NULL,read_fn,(void*)read1);
pthread_create(&write_1,NULL,write_fn,(void*)write1);
pthread_create(&read_2,NULL,read_fn,(void*)read2);
pthread_join(read_1,NULL);
pthread_join(read_2,NULL);
pthread_join(write_1,NULL);
pthread_rwlock_destroy(&lock);
return 0;
}
通过结果可以看出,打开读锁1的时候,想打开写锁1只有等到读锁1结束了,写锁才会打开,然而在写锁1之后打开读锁2的时候,读锁2也会等待写锁结束在打开。
- 多线程开发之读写锁
- 多线程之读写锁
- 多线程之读写锁
- linux多线程之读写锁
- linux多线程之读写锁
- 多线程之读写锁ReentrantReadWriteLock
- 多线程编程之自旋锁,读写锁
- Java多线程之读写锁经典案例
- java多线程读写文件之文件锁
- Java多线程Lock对象之读写锁
- Linux多线程同步之读写锁
- Linux --多线程之读写锁1
- Linux --多线程之读写锁2
- 多线程编程之八:pthread读写锁
- c#多线程读写锁
- 多线程---读写锁
- 多线程文件读写锁
- 多线程的读写锁
- 据说美剧《硅谷》是程序员成功人士的必看剧?
- C++中struct 和 class的sizeof大小
- 客户端检测
- 以Redis为缓存模块的SpringCache使用
- python学习(八)之递归函数
- 多线程开发之读写锁
- 远程服务器上文件的Last-Modified 格式化
- 【计算机网络】第2章 物理层 知识总结
- vmware中扩展linux的磁盘
- Spring笔记(二)
- JVM随笔
- [编程题] 头条校招
- 据说一个成功的研发团队应具备这9大属性
- 数据库索引原理及优化