Read/Write Lock
2008-05-30 09:23
281 查看
读者优先算法:
设置两个互斥信号量:rwmutex 用于写者与其他读者/写者互斥的访问共享数据 rmutex 用于读者互斥的访问读者计数器readcount
写者优先:
条件:
1)多个读者可以同时进行读
2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行)
3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)
解1:如果读者数是固定的,我们可采用下面的算法:
rwmutex:用于写者与其他读者/写者互斥的访问共享数据 rmutex: 该信号量初始值设为10,表示最多允许10个读者进程同时进行读操作
var rwmutex, rmutex : semaphore := 1,10 ;
cobegin
readeri begin // i=1,2,….
P(rwmutex); //读者、写者互斥
P(rmutex);
V(rwmutex); // 释放读写互斥信号量,允许其它读、写进程访问资源 读数据;
V(rmutex);
End
Writerj begin // j = 1,2,….
P(rwmutex);
For (i=1;i<=10;i++) P(rmutex); //禁止新读者,并等待已进入的读者退出 写更新;
For (i=1;i<=10;i++) V(rmutex); // 恢复允许rmutex 值为10
V(rwmutex);
End
Coend
解2:如果读者数不固定,采用下面的算法:
设置三个互斥信号量:
rwmutex 用于写者与其他读者/写者互斥的访问共享数据
rmutex 用于读者互斥的访问读者计数器readcount
nrmutex 用于写者等待已进入读者退出,所有读者退出前互斥写操作
var rwmutex, rmutex,nrmutex : semaphore := 1,1,1 ; int readcount = 0;
cobegin readeri begin // i=1,2,….
P(rwmutex);
P(rmutex);
Readcount++;
If (readcount == 1) P(nrmutex); //有读者进入,互斥写操作
V(rmutex);
V(rwmutex); // 及时释放读写互斥信号量,允许其它读、写进程申请资源 读数据;
P(rmutex);
Readcount--;
If (readcount == 0) V(nrmutex); //所有读者退出,允许写更新
V(rmutex);
End
Writerj begin // j = 1,2,….
P(rwmutex); // 互斥后续其它读者、写者
P(nrmutex); //如有读者正在读,等待所有读者读完 写更新;
V(nrmutex); //允许后续新的第一个读者进入后互斥写操作
V(rwmutex); //允许后续新读者及其它写者
End Coend
设置两个互斥信号量:rwmutex 用于写者与其他读者/写者互斥的访问共享数据 rmutex 用于读者互斥的访问读者计数器readcount
var rwmutex, rmutex : semaphore := 1,1 ; int readcount = 0; cobegin readeri begin // i=1,2,…. P(rmutex); Readcount++; If (readcount == 1) P(rwmutex); V(rmutex); 读数据; P(rmutex); Readcount--; If (readcount == 0) V(rwmutex); V(rmutex); End
Writerj begin // j = 1,2,…. P(rwmutex); 写更新; V(rwmutex); End Coend
写者优先:
条件:
1)多个读者可以同时进行读
2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行)
3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)
解1:如果读者数是固定的,我们可采用下面的算法:
rwmutex:用于写者与其他读者/写者互斥的访问共享数据 rmutex: 该信号量初始值设为10,表示最多允许10个读者进程同时进行读操作
var rwmutex, rmutex : semaphore := 1,10 ;
cobegin
readeri begin // i=1,2,….
P(rwmutex); //读者、写者互斥
P(rmutex);
V(rwmutex); // 释放读写互斥信号量,允许其它读、写进程访问资源 读数据;
V(rmutex);
End
Writerj begin // j = 1,2,….
P(rwmutex);
For (i=1;i<=10;i++) P(rmutex); //禁止新读者,并等待已进入的读者退出 写更新;
For (i=1;i<=10;i++) V(rmutex); // 恢复允许rmutex 值为10
V(rwmutex);
End
Coend
解2:如果读者数不固定,采用下面的算法:
设置三个互斥信号量:
rwmutex 用于写者与其他读者/写者互斥的访问共享数据
rmutex 用于读者互斥的访问读者计数器readcount
nrmutex 用于写者等待已进入读者退出,所有读者退出前互斥写操作
var rwmutex, rmutex,nrmutex : semaphore := 1,1,1 ; int readcount = 0;
cobegin readeri begin // i=1,2,….
P(rwmutex);
P(rmutex);
Readcount++;
If (readcount == 1) P(nrmutex); //有读者进入,互斥写操作
V(rmutex);
V(rwmutex); // 及时释放读写互斥信号量,允许其它读、写进程申请资源 读数据;
P(rmutex);
Readcount--;
If (readcount == 0) V(nrmutex); //所有读者退出,允许写更新
V(rmutex);
End
Writerj begin // j = 1,2,….
P(rwmutex); // 互斥后续其它读者、写者
P(nrmutex); //如有读者正在读,等待所有读者读完 写更新;
V(nrmutex); //允许后续新的第一个读者进入后互斥写操作
V(rwmutex); //允许后续新读者及其它写者
End Coend
相关文章推荐
- RentrantReadWriteLock
- 多线程(五)线程同步(中)-Lock,Condition, ReadWriteLock
- JAVA多线程之——读写锁 ReentrantReadWriteLock
- JAVA多线程之——读写锁 ReentrantReadWriteLock
- 利用ReentrantReadWriteLock实现缓存系统
- 深入理解读写锁—ReadWriteLock源码分析
- 《深入浅出 Java Concurrency》—锁机制(九) 读写锁 (ReentrantReadWriteLock) (2)
- ReentrantReadWriteLock
- Synchronized与ReentrantReadWriteLock性能比较
- 【Java多线程】ReentrantReadWriteLock
- ReentrantReadWriteLock
- Java并发之ReentrantReadWriteLock
- java.util.concurrent包图文源码解析(三)——ReentrantReadWriteLock
- 使用ReadWriteLock实现模拟缓存
- ReentrantReadWriteLock详解及应用:缓存和大量数据并发访问
- read write spinlock
- 使用ReentrantReadWriteLock进行线程通信
- 《深入浅出 Java Concurrency》—锁机制(九) 读写锁 (ReentrantReadWriteLock) (2)
- ReadWriteLock
- “J.U.C”:ReentrantReadWriteLock