`

可重入函数及锁机制

阅读更多
可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。
目录

简介

可重入函数也可以这样理解,重入即表示重复进入,首先它意味着这个函数可以被中断,其次意味着它除了使用自己栈上的变量以外不依赖于任何环境(包括static),这样的函数就是purecode(纯代码)可重入,可以允许有该函数的多个副本在运行,由于它们使用的是分离的栈,所以不会互相干扰。如果确实需要访问全局变量(包括static),一定要注意实施互斥手段。可重入函数在并行运行环境中非常重要,但是一般要为访问全局变量付出一些性能代价。
编辑本段
注意事项

编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护。
若对所使用的全局变量不加以保护,则此函数就不具有可重入性,即当多个进程调用此函数时,很有可能使有关全局变量变为不可知状态。

附:java 高并发 ReentrantLock -- 可重入的锁
参见:http://blog.sina.com.cn/s/blog_67c1057e0100uwcn.html
http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html
什么时候选择用 ReentrantLock 代替 synchronized
既然如此,我们什么时候才应该使用 ReentrantLock 呢?答案非常简单 —— 在确实需要一些 synchronized 所没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。 ReentrantLock 还具有可伸缩性的好处,应当在高度争用的情况下使用它,但是请记住,大多数 synchronized 块几乎从来没有出现过争用,所以可以把高度争用放在一边。我建议用 synchronized 开发,直到确实证明 synchronized 不合适,而不要仅仅是假设如果使用 ReentrantLock “性能会更好”。请记住,这些是供高级用户使用的高级工具。(而且,真正的高级用户喜欢选择能够找到的最简单工具,直到他们认为简单的工具不适用为止。)。一如既往,首先要把事情做好,然后再考虑是不是有必要做得更快。
分享到:
评论

相关推荐

    Oracle 常用函数及使用技术

    Oracle 常用函数及使用技术如数据库锁机制 RowId

    INFORMIX函数大全及相关资料

    INFORMIX的资料太难找了,自己整理了一些,包括: 1、INFORMIX函数大全.pdf...3、informix的事务、并发控制、锁机制、隔离级别.docx 4、oracle和informix的基础区别.docx 5、Shell脚本和Informix的交互实现技巧.docx

    MySQL数据库实战例子(存储引擎、视图、锁机制、分表)

    本例子主要以存储引擎、视图、存储函数、锁机制、分表为主,并且配以对应的博客全面解析。 这个例子的博客系列在这里:http://blog.csdn.net/Jack__Frost/article/category/6998564

    PHP文件锁函数flock()详细介绍

    在PHP中提供了flock()函数,可以对文件使用锁定机制(锁定或释放文件)。当一个进程在访问文件时加上锁,其他进程要想对该文件进行访问,则必须等到锁定被释放以后。这样就可以避免在并发访问同一个文件时破坏数据。...

    高级开发并发面试题和答案.pdf

    synchronize实现基础syn为什么一定有可重入特性; synchronized 实现可重入性; reenlock和synchronize区别; ReentrantLock如何实现可重入性 volatile作用; wait 与 sleep 的有什么不同?回答的要点四个: Thread....

    数据库锁和索引实验

    数据库的锁机制以及索引的应用。一.目的 1、掌握锁机制的原理,学会制造死锁 2、掌握事务隔离级别的原理及实现 3、掌握B*树索引的相关概念,学会创建B*树索引 4、学会设计B*树索引,基于函数的索引和基于外键的...

    Golang mk教程-Go语言视频零基础入门到精通项目实战web编程

    第04天-基础-闭包、数组、切片、锁机制 第05天-进阶-排序、链表、二叉树、接口 第06天-进阶-接口与反射详解 第07天-进阶-接口实例、终端文件读写、异常处理 第08天-进阶-goroute详解、定时器与单元测试 第09天-高级-...

    Python使用文件锁实现进程间同步功能【基于fcntl模块】

    本文将通过fcntl模块的文件整体上锁机制来实现这种进程间同步功能。 fcntl系统函数介绍 Linux系统提供了文件整体上锁(flock)和更细粒度的记录上锁(fcntl)功能,底层功能均可由fcntl函数实现。 首先来了解记录上锁。...

    WindowsAPI参考手册

    学习Win32 API 能更深刻的理解MFC 的运作机制,同时使用Win32 API 函数编程要比使用MFC 更灵活, 能编写出更加高效的程序。Microsoft Win32 API 也可以在VB 和Delphi 等语言中使用。 Microsoft Win32 API 函数按照...

    Linux系统编程之线程同步

    所以,互斥锁实质上是操作系统提供的一把“建议锁”(又称“协同锁”),建议程序中有多线程访问共享资源的时候使用该机制。但,并没有强制限定。 因此,即使有了mutex,如果有线程不按规则来访问数据,依然会造成...

    Java面试Mysql.pdf

    sql的执行顺序 索引的优点和缺点 怎么避免索引失效(也属于sql优化的一种) 一条sql查询非常慢,我们怎么去排查...锁机制与InnoDB锁算法 从锁的类别上分MySQL都有哪些锁呢?像上面那样子进行锁定岂不是有点阻碍并发效率了

    linux 可执行文件与写操作的同步问题(文件读写操作产生的锁机制)

    当一个可执行文件已经为write而open时,此时的可执行文件是不允许被执行的。反过来,一个文件正在执行时,它也是不允许同时被write模式而open的。这个约束很好理解,因为文件执行和文件被写应该需要同步保护,因此...

    Android4.0开发之Keyguard解锁屏机制详解

    本文实例讲述了Android4.0 Keyguard解锁屏机制。分享给大家供大家参考,具体如下: Keyguard解锁屏是Android系统中必不可少的模块,用户在开机后或者在点击Power按钮屏幕变亮后首先看到的画面即为解锁屏模块对应的...

    Android多线程之同步锁的使用

    对于Java来说,最常用的同步机制就是synchronized关键字,他是一种基于语言的粗略锁,能够作用于对象、函数、class。每个对象都只有一个锁,谁能够拿到这个锁谁就有访问权限。当synchronized作用于函数时,实际上锁...

    免费超全面的Java基础类型,容器,并发,IO流,面向对象,Web编程等代码总结

    锁锁机制,API详解 Fork/Join 框架机制详解 Executor线程池框架简介 面向对象 泛型机制与反射原理 Proxy动态代理机制详解 从整体上观察对象 网络开发 Servlet基础,生命周期执行过程 Http请求详解,握手挥手流程...

    Java synchronized详细解读.docx

    无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。 每个对象只有一个锁(lock)与之相关联。 实现同步是要很...

    Java synchronized 详解.docx

    无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。 每个对象只有一个锁(lock)与之相关联。 实现同步是要很...

    UNIX环境高级编程部分

    10.6 可再入函数 10.7 SIGCLD语义 10.8 可靠信号术语和语义 10.9 kill 和raise函数 10.10 alarm和 pause函数 10.11 信号集 10.12 sigprocmask 函数 10.13 sigpending函数 10.14 sigaction函数 10.15 sigsetjmp 和...

    《UNIX网络编程 第2版. 第2卷, 进程间通信(中文版)》(W·Richard Stevens[美] 著)

    良好的进程间通信(IPC)机制是提高UNIX程序性能的关键。本书全面深入地讲解了各种进程间通信形式,包括消息传递、同步、共享内存及远程调用(RPC)。书中包含了大量经过优化的源代码,帮助读者加深理解。这些源代码...

    java多线程自增效率比较及原理解析

    同时,本文也对这些方法的原理进行了简单解析,如synchronized关键字的互斥锁机制、AtomicInteger的CAS机制、LongAdder的分段累加机制以及LongAccumulator的自定义函数累加机制等。适用于Java开发人员和多线程编程...

Global site tag (gtag.js) - Google Analytics