开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2528|回复: 1
收起左侧

[C#图文教程] 转载 多线程的那点儿事(之顺序锁)

[复制链接]

结帖率:100% (5/5)
发表于 2012-6-27 11:22:46 | 显示全部楼层 |阅读模式   山西省临汾市
    在互斥数据访问中有一种多读少写的情况。正对这么一种情形,我们也提出了读写锁的方案。但是呢,这个锁有些缺陷。什么缺陷呢?那就是,这个写锁需要在所有的读锁完成之后才能写。否则的话,写锁需要这么一直等下去。
    那么,有没有什么办法能使得写操作快速一点进行呢?那就是顺序锁。
  1. typedef struct _SEQUENCE_LOCK   
  2. {   
  3.     unsigned int sequence;   
  4.     HANDLE hLock;   
  5.    
  6. }SEQUENCE_LOCK;  
复制代码
有了这么一个数据结构之后。那么读锁怎么开始呢,
  1. unsigned int get_lock_begin(SEQUENCE_LOCK* hSeqLock)   
  2. {   
  3.     assert(NULL != hSeqLock);   
  4.    
  5.     return hSeqLock->sequence;      
  6. }      
  7.    
  8. int get_lock_retry(SEQUENCE_LOCK* hSeqLock, unsigned int value)   
  9. {   
  10.     unsigned int new_value;   
  11.     assert(NULL != hSeqLock);   
  12.    
  13.     new_value = hSeqLock->sequence;   
  14.     return (new_value & 0x1) || (new_value ^ value);      
  15. }  
复制代码
自然写锁也需要修改了,
  1. void get_write_lock(SEQUENCE_LOCK* hSeqLock)   
  2. {   
  3.     assert(NULL != hSeqLock);   
  4.    
  5.     WaitForSingleObject(hSeqLock->hLock);   
  6.     hSeqLock->sequence ++;   
  7. }   
  8.    
  9. void release_write_lock(SEQUENCE_LOCK* hSeqLock)   
  10. {   
  11.     assert(NULL != hSeqLock);   
  12.    
  13.     hSeqLock->sequence ++;   
  14.     ReleaseMutex(hSeqLock->hLock);   
复制代码
如果应用呢,其实也不难,
  1. void read_process(SEQUENCE_LOCK* hSeqLock)   
  2. {   
  3.     unsigned int sequence;   
  4.    
  5.     do{   
  6.        sequence = get_lock_begin(hSeqLock);   
  7.        /* read operation  */   
  8.     }while(get_lock_retry(hSeqLock, sequence));   
  9. }   
  10.    
  11. void write_process(SEQUENCCE_LOCK* hSeqLock)   
  12. {   
  13.     get_write_lock(hSeqLock);   
  14.     /* write operation */   
  15.     release_write_lock(hSeqLock);   
  16. }  
复制代码
总结:
    (1)读锁退出有两个条件,要么写操作正在进行呢,要么没有写锁
    (2)写锁之间需要互斥操作
    (3)互斥操作的数据不能是指针,否则有可能在访问的时候会造成异常,因为有可能边写边读
(4)顺序锁代替不了读写锁,因为读写锁可以保证所有的数据操作,而顺序锁不行

结帖率:61% (35/57)

签到天数: 1 天

发表于 2012-7-11 06:14:55 | 显示全部楼层   海南省乐东黎族自治县
好。。沙发啊。。支持楼主。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表