可重入函数

可重入函数

Y=f(x)。一般的函数都是可重入的。

如果2次顺序调用,其结果不同,那么不是可重入的。

这是说的单线程,2次调用情况。这是程序员有意调用,它设计这个函数就是为了有状态。

例子就是局部static变量。

还有一类问题是 多线程,就是不是有意调用2次,而是无意中调用。并发调用,谁先谁后不知道,但是后调的,结果不是预期的。C库里面很多使用静态变量的如gethostname就是这个问题。

不可重入函数的本质在于,函数是有状态的。2次调用,是不同的状态。

真实世界存在这样的模型,需要用有状态函数模拟。

事实上,object就是有状态的例子,它的data member你可以看作是状态,不同的member function就是 不可重入地、共享状态的一堆函数。

Object本质是围绕共同数据的一堆函数,共同数据是堆上面的一块内存,this

这堆函数间是有关系的,有顺序关系,最初状态的初始化,在构造函数里面完成。

真实的世界是,一个CD机要唱歌,先要加电,不加电时,点击下一首,没有用,因为没有进入“已加电”状态。这类东西,用object很容易模拟,因为模型和真实,对应很明显。

在OO编程里面,函数都是不可重入的,因为函数共享了this。多线程不安全。你得用SYNC关键字在JAVA里面。

传统C里面,都是可重入的,多线程安全,除非有static变量。

据说可重入很复杂,有本书《Java并发编程—设计原则与模式》,Doug Lee写的,可惜中文买不到了。

Doug Lea has written a very handy book called Concurrent Programming in Java™: Design Principles and Patterns, Second Edition (Addison-Wesley, 2000). This book is invaluable, even to non-Java programmers. It is packed with in-depth discussions and examples and good design principles. Even if you aren't building highly concurrent applications, this book is worth careful study.

posted on 2011-05-31 15:14  SimonBlog  阅读(322)  评论(1编辑  收藏  举报

导航