奔五小白大叔也来谈谈锁

考虑到如下一个实例:

bool add(T obj)

{

if(count>=maxCount)

return false;

...

++count;

return true;

}

这应该是一个最简单最平常需要用到的一个实例吧,我需要为一个容器里添加一个T对象,但数量是有限制的,这在单线程情况下,直接这么写应该是没什么错,反正就是响应用户的单次请求,任何时候应该都能保证count是最新的,count是一个公共变量,可以被多个线程全局访问。

但是,在多线程情况下,就有可能会出现:多个线程是有可能同时到达 if(count>=maxCount)这一条语句,在这种情况下,就会出现每一个线程里的count的值都是同样的情况,即使是有一个线程正在执行++count,但当线程的代码在其它线程执行++count之前,当前线程里的代码里的count数据就已经被引用到判断语句里了。可能有些人会想着:我把count锁了不就行了吗?

当然不行,你可以在当前线程里锁住count,只有您能在后面的代码中对它进行变更,但架不住在您对它进行更新值之前,其它的线程已经执行到了这条判断语句,所以锁住它是没什么意义的,是吗?

所以,我们需要的,应应该是:我要锁住这一整段的代码块,让当前线程在执行到++count之前,其它的线程只能是在if(count>=....这一个代码之前等待,这让count在所有的线程在执行这个判断语句的时候,都一定是最新的值。

在.net框架下,有一个叫做 SyncLock 语句是专门干这个事的,我有写过一个实例原型,是用vb.net写的,

Public Function SetDataLock(DataTableID As String, Lock As Boolean, Optional WaitForUnlock As Boolean = True) As Boolean
    SyncLock lockObject '这里加一个锁,意思是所有的线程执行到这里,就会检查lockObject,如果它被锁了,就在这一条语句等待,直到lockObject被放开
        Dim isLock As Boolean = myCache("DATATABLE-LOCK:" & DataTableID.ToUpper)
        If Not Lock Then
            If Not isLock Then
                myCache("DATATABLE-LOCK:" & DataTableID.ToUpper) = False
                DataLockList(DataTableID) = False
                Return True
            End If

            Dim x As String = myCache("DATATABLE-LOCK-PWD:" & DataTableID.ToUpper)
            If x = "" Or UnLockDataTablePassword = x Then
                myCache("DATATABLE-LOCK:" & DataTableID.ToUpper) = False
                DataLockList(DataTableID) = False
                Return True
            End If
            Return False
        End If
    End SyncLock

....

在这里,我加锁的实际上是lockObject,而并不是count或者某个datatableID。

同样的道理,在前面的代码里,应该是要有一个锁,让所有的线程在执行到if(count>=...这一条语句之前,先判断是不是已经有线程在准备对它进行更新了。

很遗憾,我的VxTerm在使用C++过程中,并未涉及到这一个内容,所以我并不知道在C++是否有行之有效的可以完成这种功能的锁。

在网上搜到的各种锁的文章里,都没有能让我觉得满意的内容,所有我能搜到的关于C++的锁的文章,都让我看得云里雾里的,不知道它们具体到是能完成什么样的功能。

本篇内容只是在抛砖引玉,同时也是为了记录自己的一些经验。在后面的编程过程中,如果涉及到相关的内容,也好翻出来做参考,避免走弯路。

如果您正好也对这个内容有所了解,也知道了它的解决办法,或者是觉得我内容里写的并不正确,欢迎您提出宝贵的意见。

谢谢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不了阁-飞哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值