• 2007-02-08

    锁住数据

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/4492152.html

    这几天在写多线程程序。

    有了一定的开发经验之后,写程序主要是查找API用法的过程。对于多线程来说,主要就是线程创建、同步互斥这些基本API的用法。互斥主要是用锁,我查了一下用Mutex做锁的方法,基本上是看一下用法就知道怎么用了。不过,写代码的时候,突然发现一个很别扭的地方,我不知道自己的锁该锁在哪里了。想来想去,原来是我找到那几篇教程的误导。

    通常多线程教程中,给人的例子会给出一个线程的函数,然后在其中给出锁的用法,比如:
    void threadFunc(void* param) {
        lock(&my_lock);
        ...
        unlock(&my_lock);
    }

    这段代码给人传递的信息是用锁来锁住这段代码,而事实上,锁的真正目标并非代码,而是数据。

    想想那些来自操作系统课程的例子,比如取钱的例子。甭管怎么取,总之,银行不愿意亏,所以,它要保护的是你的账户。至于你究竟是通过ATM取款还是网上银行,它根本不关心。由此可见,锁的目标是内容,而非行为。

    当然,锁住数据之后,一般会有一系列的操作,所以,这越发像保护代码了。但事实上,不是。在这点上,Java做得比较不错,它把锁绑在了对象上,也就是相当于跟到了数据上,synchronized的时候,锁住的就是数据。

    在程序设计中,代码只是用不同的方式在处理数据,最为核心的还是数据。所以,别管戏法如何变,盯住数据,我们就可以在暴风骤雨中岿然不动了。

    又一次谈到了数据,之前是《管窥OS——进程透明化》和《有状态的程序》。

    分享到:

    历史上的今天:

    Hello,V8 2009-02-08
    引用地址:

    评论

  • 有点收获。。。
  • 锁住数据?锁住的应当是操作呀
    回复陈老师说:
    从本质上来说,真正要保护的是数据,所以,锁应该以数据为目标。
    之所以有锁操作的说法,主要还是因为看起来,操作会改变数据。但实际上,对于实际上不修改数据的操作,锁它干甚么。
    做多线程的分析时,都是应该以数据为分析的核心,而非操作。
    2007-02-11 17:31:11