多线程开发之读写锁
2017-08-23 14:12
120 查看
读写锁与互斥量类似,不过读写锁允许更高的并行,互斥量要么是锁住状态,要么是不加锁状态。而且一次只有一个线程可以对其枷锁。读写锁就不一样了,虽然一次只有一个线程可以占有写模式的读写锁,但是多个可以同时占有读模式的读写锁。
首先介绍:读锁,具体看代码:
#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也会等待写锁结束在打开。
首先介绍:读锁,具体看代码:
#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也会等待写锁结束在打开。
相关文章推荐
- 基于英特尔多核处理器平台的多线程开发(2)
- java多线程学习笔记——读写锁(ReentrantReadWriteLock)
- iOS多线程开发
- iOS多线程开发小demo5 线程间的通信
- iphone开发中,多线程下sqlite锁定的问题
- iOS开发多线程篇—多线程简单介绍
- iOS开发多线程之总结篇(常见用法、常用方法)
- 【收集】winform编程多线程开发环境中修改UI的Helper
- .NET应用架构设计—服务端开发多线程使用小结(多线程使用常识)
- 由浅入深多线程开发概念
- 多线程应用程序开发之二 基于omniThread 的多线程应用程序示例
- iOS开发笔记--iOS图解多线程
- IOS多线程开发之GCD
- 多线程的那点儿事(之读写锁)
- Java开发学习笔记:Java实现多线程的方法
- iOS开发中遇到的几种多线程
- 使用NSOperationQueue简化多线程开发
- 多线程编程之二——MFC中的多线程开发
- C# WinForm多线程开发(一) Thread类库
- WPF开发中的多线程的问题