【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

在互斥数据访问中有一种多读少写的情况。正对这么一种情形,我们也提出了读写锁的方案。但是呢,这个锁有些缺陷。什么缺陷呢?那就是,这个写锁需要在所有的读锁完成之后才能写。否则的话,写锁需要这么一直等下去。

那么,有没有什么办法能使得写操作快速一点进行呢?那就是顺序锁。

typedef struct _SEQUENCE_LOCK
{unsigned int sequence;HANDLE hLock;}SEQUENCE_LOCK;

有了这么一个数据结构之后。那么读锁怎么开始呢,

unsigned int get_lock_begin(SEQUENCE_LOCK* hSeqLock)
{assert(NULL != hSeqLock);return hSeqLock->sequence;
}   int get_lock_retry(SEQUENCE_LOCK* hSeqLock, unsigned int value)
{unsigned int new_value;assert(NULL != hSeqLock);new_value = hSeqLock->sequence;return (new_value & 0x1) || (new_value ^ value);
}

自然写锁也需要修改了,

void get_write_lock(SEQUENCE_LOCK* hSeqLock)
{assert(NULL != hSeqLock);WaitForSingleObject(hSeqLock->hLock);hSeqLock->sequence ++;
} void release_write_lock(SEQUENCE_LOCK* hSeqLock)
{assert(NULL != hSeqLock);hSeqLock->sequence ++;ReleaseMutex(hSeqLock->hLock);
}

如果应用呢,其实也不难,

void read_process(SEQUENCE_LOCK* hSeqLock)
{unsigned int sequence;do{sequence = get_lock_begin(hSeqLock);/* read operation  */}while(get_lock_retry(hSeqLock, sequence));
}void write_process(SEQUENCCE_LOCK* hSeqLock)
{get_write_lock(hSeqLock);/* write operation */release_write_lock(hSeqLock);
}

总结:
    (1)读锁退出有两个条件,要么写操作正在进行呢,要么没有写锁

(2)写锁之间需要互斥操作

(3)互斥操作的数据不能是指针,否则有可能在访问的时候会造成异常,因为有可能边写边读

(4)顺序锁代替不了读写锁,因为读写锁可以保证所有的数据操作,而顺序锁不行

多线程的那点儿事(之顺序锁)相关推荐

  1. 多线程的那点儿事(之大结局)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 多线程一直是我比较喜欢的话题,当然也是很多朋友比较害怕的话题.喜欢它,因为它确实可以提高pc的 ...

  2. 多线程的那点儿事(之无锁链表)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面,为了使得写操作快速进行,我们定义了顺序锁.但是顺序锁有个缺点,那就是处理的数据不能是指针 ...

  3. linux内核同步之信号量、顺序锁、RCU、完成量、关闭中断【转】

    转自:http://blog.csdn.net/goodluckwhh/article/details/9006065 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 一信号量 ...

  4. 死锁终结者:顺序锁和轮询锁!

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone 死锁(Dead Lock)指的是两个或两个以上的运算单元(进程.线程或协程),都在等 ...

  5. 内核并发控制---顺序锁 (来自网易)

    定义在头文件linux/seqlock.h中; 顺序锁(seqlock)是对读写锁的一种优化,若使用顺序锁,读执行单元绝对不会被写执行单元所阻塞,也就是说,读执行单元可以在写执行单元对被顺序锁保护的共 ...

  6. Linux内核中的同步原语:自旋锁,信号量,互斥锁,读写信号量,顺序锁

    Linux内核中的同步原语 自旋锁,信号量,互斥锁,读写信号量,顺序锁 rtoax 2021年3月 在英文原文基础上,针对中文译文增加5.10.13内核源码相关内容. 1. Linux 内核中的同步原 ...

  7. linux并发控制之顺序锁

    顺序锁是对读写锁的一种优化. 1.读执行单元绝对不会被写执行单元阻塞.即读执行单元可以在写执行单元对被顺序锁保护的共享资源进行写操作的同时仍然可以继续读,而不必等待写执行单元完成之后再去读,同样,写执 ...

  8. Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)

    本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...

  9. 多线程的那点儿事(之无锁队列)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 对于编写多线程的朋友来说,队列具有天生的互斥性.在队列里面,一个负责添加数据,一个负责处理数据 ...

最新文章

  1. RocketMQ最佳实战
  2. 面向对象程序设计第二次作业(2)
  3. SAP CDS view 单元测试框架 Test Double 介绍
  4. 程序员太牛了 公司年会整成代码讨论会
  5. 互站卖的分发美化版可以封装双端APP
  6. Apollo开发平台授权管理的使用
  7. 用汇编语言实现itoa函数
  8. Q81:“三角形网格”之“PLY文件”
  9. 首都师范 博弈论 5 5 1大联盟合作博弈中如何量化决策影响力 班扎夫权力指数
  10. Java事务处理总结
  11. android蓝牙耳机来电铃声,Android实现积极连接蓝牙耳机
  12. 【深度学习之美】LSTM长短记,长序依赖可追忆(入门系列之十四)
  13. 小程序开发笔记(二):微信小程序富文本编辑器editor的使用
  14. 一期Go群问答-并发控制-数据竞争-错误与异常
  15. 【if语句与表达式】
  16. 使用AFNetWorking读取JSON出现NSCocoaErrorDomain Code=3840的解决方法
  17. 重庆邮电大学计算机2019湖北分数线,2019重庆邮电大学录取分数线多少?预测指南,重庆邮电大学分数线...
  18. 每日总结(第一天)(2020/3/27/22:11)(1/90)
  19. 校园网免认证停机卡免流服务器被迫关停
  20. 如何看手相 男左女右(转)

热门文章

  1. 咦,用浏览器做人脸检测,竟然这么简单?
  2. 0c-38-ARC快速入门
  3. 如何把hadoop源码关联到eclipse工程中
  4. Boost正则表达式库regex常用search和match示例 - 编程语言 - 开发者第2241727个问答
  5. 面试题解析:1 Java中switch语句可以作用在enum上的测试
  6. 民航重组:做大容易做强难
  7. server2003 IIS6.0 网站不可用
  8. maven00----maven学习说明
  9. BUPT复试专题—C翻转(2010)
  10. html基本标签练习