zoukankan      html  css  js  c++  java
  • 可重入与线程安全

    ----------可重入------------

    概念:

      可重入函数,即函数(操作)中断后,再次进入该函数继续执行仍能得到正确的结果,这里强调的是中断后能正确执行。

    举个例子:

      程序执行到某个函数foo()时,收到信号,于是暂停目前正在执行的函数,转到信号处理函数,而这个信号处理函数的执行过程中,又恰恰也会进入到刚刚执行 的函数foo(),这样便发生了所谓的重入。此时如果foo()能够正确的运行,而且处理完成后,之前暂停的foo()也能够正确运行,则说明它是可重入 的。这里不涉及到线程的概念,重要的是中断后可重新继续,并得到正确的结果。

    ---------线程安全--------

    概念:

      线程安全的概念比较直观。一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。强调多线程并发调用不会发生错误。

     形式:

    1)函数内部含有共享数据,但是代码段操作本身是原子操作,那么这个函数是线程安全的。比如对一个位宽内的变量进行赋值操作。

    2)函数内部操作加锁互斥,通过这种方式,保证只有当一个线程执行完该段代码后,另一个线程才能来执行,保证数据不受污染。

    注释:原子操作:在CPU一个时间片内可以执行完成的操作,也就是一条汇编指令可以完成的操作;

    区别:

    以上两个概念经常有人让人混淆不清,那么请注意两个概念的红字部分,这也就是他们的区别。

    有概念提出可重入的函数一定是线程安全的,个人觉得,这种提法虽然没有错误,线程安全本身就是为了保护共享数据,可重入函数本身并不涉及共享数据的保护,且数据都有独立的栈空间,谈不谈线程安全也没有什么意义。且这种提法容易使人混淆线程安全和可重入的概念。

  • 相关阅读:
    高速排序
    Android 中实现分享和第三方登陆---以新浪微博为例
    linux下用mail发送邮件
    hello.c内核模块编译 -- linux内核
    最小生成树
    JDBC连接Oracle数据库
    解决方案:zabbix(WEB界面的提供分布式系统监视以及网络监视功能)
    Grunt:grunt-tmod
    打包器:Webpack
    模板:art-template-loader
  • 原文地址:https://www.cnblogs.com/wangkeqin/p/9804605.html
Copyright © 2011-2022 走看看