专栏首页cwl_JavaC++多线程-顺序锁

C++多线程-顺序锁

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

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)顺序锁代替不了读写锁,因为读写锁可以保证所有的数据操作,而顺序锁不行

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 快速学习ES6-查询

    在上面的案例中,不仅会查询到电视,而且与小米相关的都会查询到,多个词之间是or的关系。

    cwl_java
  • C++-入门语法(三)

    cwl_java
  • 前端基础-css字体与文本属性

    一张图片的打印出来的实际尺寸是由电子图片的像素和分辨率共同决定的,像素(Pixel)是指构成图片的小色点,分辨率(单位DPI)是指每英寸(Inch)上的像素数量...

    cwl_java
  • 「2017 Multi-University Training Contest 7」2017多校训练7

    饶文津
  • 简单的表单验证

    <head> <meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″ /> ...

    苦咖啡
  • 人工智能将改变5亿个白领工作岗位

    很明显,人工智能已经影响了我们的生活方式。每次我们请求 Siri 做基本的数学运算或呼叫 Alexa 来调节温度时,我们都用上了AI。

    云水木石
  • NumPy的文件读写

    王小婷
  • IntelliJ IDEA插件——冷门神器分享

    IntelliJ IDEA就不必介绍了,至今还能保持IDE前三的神器,如今java程序员的首选,今天介绍几款冷门但绝对是神器的IDEA插件。 前言 IDEA自不...

    itmifen
  • 150 行代码,手搓一个 Immer

    Immer结合 Copy-on-write 机制与 ES6 Proxy 特性,提供了一种异常简洁的不可变数据操作方式:

    ayqy贾杰
  • DNS高级应用之ACL和View

    一、环境准备: 1、准备三台主机,要求如下 (1) DNS服务器双网卡:eth0:192.168.10.203 eth1: 172.16.2.1...

    小小科

扫码关注云+社区

领取腾讯云代金券