欢迎来到天天文库
浏览记录
ID:51657695
大小:26.00 KB
页数:2页
时间:2020-03-14
《多线程的那点儿事(之顺序锁).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、所有的数据操作,而顺序锁不行 此文档仅供学习与交流
此文档下载收益归作者所有