多线程的那点儿事(之顺序锁).doc

多线程的那点儿事(之顺序锁).doc

ID:51657695

大小:26.00 KB

页数:2页

时间:2020-03-14

多线程的那点儿事(之顺序锁).doc_第1页
多线程的那点儿事(之顺序锁).doc_第2页
资源描述:

《多线程的那点儿事(之顺序锁).doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、此文档收集于网络,如有侵权,请联系网站删除多线程的那点儿事(之顺序锁)在互斥数据访问中有一种多读少写的情况。正对这么一种情形,我们也提出了读写锁的方案。但是呢,这个锁有些缺陷。什么缺陷呢?那就是,这个写锁需要在所有的读锁完成之后才能写。否则的话,写锁需要这么一直等下去。那么,有没有什么办法能使得写操作快速一点进行呢?那就是顺序锁。[cpp]viewplaincopy1typedefstruct_SEQUENCE_LOCK2{3unsignedintsequence;4HANDLEhLock;5}SEQUENCE_LOCK;有了这么一个数据结

2、构之后。那么读锁怎么开始呢,[cpp]viewplaincopy6unsignedintget_lock_begin(SEQUENCE_LOCK*hSeqLock)7{8assert(NULL!=hSeqLock);9returnhSeqLock->sequence;10}11intget_lock_retry(SEQUENCE_LOCK*hSeqLock,unsignedintvalue)12{13unsignedintnew_value;14assert(NULL!=hSeqLock);15new_value=hSeqLock->seq

3、uence;16return(new_value&0x1)

4、

5、(new_value^value);17}自然写锁也需要修改了,[cpp]viewplaincopy18voidget_write_lock(SEQUENCE_LOCK*hSeqLock)19{20assert(NULL!=hSeqLock);21WaitForSingleObject(hSeqLock->hLock);22hSeqLock->sequence++;23}24voidrelease_write_lock(SEQUENCE_LOCK*hSeqLock)25{26as

6、sert(NULL!=hSeqLock);27hSeqLock->sequence++;28ReleaseMutex(hSeqLock->hLock);29}如果应用呢,其实也不难,[cpp]viewplaincopy30voidread_process(SEQUENCE_LOCK*hSeqLock)31{32unsignedintsequence;此文档仅供学习与交流此文档收集于网络,如有侵权,请联系网站删除1do{2sequence=get_lock_begin(hSeqLock);3/*readoperation*/4}while(g

7、et_lock_retry(hSeqLock,sequence));5}6voidwrite_process(SEQUENCCE_LOCK*hSeqLock)7{8get_write_lock(hSeqLock);9/*writeoperation*/10release_write_lock(hSeqLock);11} 总结: (1)读锁退出有两个条件,要么写操作正在进行呢,要么没有写锁(2)写锁之间需要互斥操作(3)互斥操作的数据不能是指针,否则有可能在访问的时候会造成异常,因为有可能边写边读(4)顺序锁代替不了读写锁,因为读写锁可以保证

8、所有的数据操作,而顺序锁不行 此文档仅供学习与交流

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。