竞态条件
如果程序运行顺序的改变会影响最终结果,这种情况即竞态条件,即程序的不同执行流,执行顺序的不同,导致程序运行结果不同
导致竞态条件发生的代码区称作临界区。在临界区中使用适当的同步就可以避免竞态条件
关于临界区、临界资源的分析可见另一篇博客
重入
先看一下下面的实例:
有两个PCB(p1,p2)分别要对一个全局变量 val = 10 进行 – 的操作,正常情况下结果应该是 8 ,但在临界资源的访问 + 操作系统对进程的调度下,可能会导致 p1 先将数据进行寄存未修改,p2 就已经占用 CPU 进行数据寄存和修改 val 为 9,之后再进行 p1 的修改,p1根据上下文信息将未修改前的 val (10)进行修改,依旧得到 9
重入:不同的执行流可以访问同样的资源(同样的代码)
可重入:不同的执行流可以访问同样的资源,不会对程序的结果产生影响
不可重入:不同的执行流可以访问同样的资源,但会对程序的结果产生影响
全局变量、malloc、free 及 STL 当中大部分容器都是不可重入的