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

上传人:scccc 文档编号:13064817 上传时间:2021-12-13 格式:DOCX 页数:2 大小:21.04KB
返回 下载 相关 举报
多线程的那点儿事(之顺序锁).docx_第1页
第1页 / 共2页
多线程的那点儿事(之顺序锁).docx_第2页
第2页 / 共2页
亲,该文档总共2页,全部预览完了,如果喜欢就下载吧!
资源描述

《多线程的那点儿事(之顺序锁).docx》由会员分享,可在线阅读,更多相关《多线程的那点儿事(之顺序锁).docx(2页珍藏版)》请在三一文库上搜索。

1、 软件英才网 软件行业驰名招聘网站 多线程的那点儿事(之顺序锁) 在互斥数据访问中有一种多读少写的情况。正对这么一种情形,我们也提出了读写锁的方案。但是呢,这个锁有些缺陷。什么缺陷呢?那就是,这个写锁需要在所有的读锁完成之后才能写。否则的话,写锁需要这么一直等下去。 那么,有没有什么办法能使得写操作快速一点进行呢?那就是顺序锁。cpp view plaincopy1 typedef struct _SEQUENCE_LOCK 2 3 unsigned int sequence; 4 HANDLE hLock; 5 6 SEQUENCE_LOCK; 有了这么一个数据结构之后。那么读锁怎么开始呢,

2、cpp view plaincopy7 unsigned int get_lock_begin(SEQUENCE_LOCK* hSeqLock) 8 9 assert(NULL != hSeqLock); 10 11 return hSeqLock->sequence; 12 13 14 int get_lock_retry(SEQUENCE_LOCK* hSeqLock, unsigned int value) 15 16 unsigned int new_value; 17 assert(NULL != hSeqLock); 18 19 new_value = hSeqLock-&g

3、t;sequence; 20 return (new_value & 0x1) | (new_value value); 21 自然写锁也需要修改了,cpp view plaincopy22 void get_write_lock(SEQUENCE_LOCK* hSeqLock) 23 24 assert(NULL != hSeqLock); 25 26 WaitForSingleObject(hSeqLock->hLock); 27 hSeqLock->sequence +; 28 29 30 void release_write_lock(SEQUENCE_LOCK*

4、hSeqLock) 31 32 assert(NULL != hSeqLock); 33 34 hSeqLock->sequence +; 35 ReleaseMutex(hSeqLock->hLock); 36 如果应用呢,其实也不难,cpp view plaincopy37 void read_process(SEQUENCE_LOCK* hSeqLock) 38 39 unsigned int sequence; 40 41 do 42 sequence = get_lock_begin(hSeqLock); 43 /* read operation */ 44 while(

5、get_lock_retry(hSeqLock, sequence); 45 46 47 void write_process(SEQUENCCE_LOCK* hSeqLock) 48 49 get_write_lock(hSeqLock); 50 /* write operation */ 51 release_write_lock(hSeqLock); 52 总结: (1)读锁退出有两个条件,要么写操作正在进行呢,要么没有写锁 (2)写锁之间需要互斥操作 (3)互斥操作的数据不能是指针,否则有可能在访问的时候会造成异常,因为有可能边写边读 (4)顺序锁代替不了读写锁,因为读写锁可以保证所有的数据操作,而顺序锁不行1 有需要请联系我们

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1