《计算机程序的构造与解释》(十六)

来源:互联网 发布:2012欧洲杯决赛数据 编辑:程序博客网 时间:2024/06/08 06:33

程序的并发:

    没有副作用的函数,其值只依赖于输入参数,也就是它内部的表达式的值,总是相同的。但是对于有赋值操作的函数,也即有了副作用,函数内某些表达式的值,不确定了,依赖于求值的时刻,这就引入了时间因素。比如你有个银行账户,你每次从中取钱,那么你账户的余额每次都会不同。这是因为这个取款(withdraw)函数包含了修改“账户”变量,并且保持这个变量的值直到再次调用取款函数修改它。如果只有你一个人进行取款,或者每次只允许一次取款操作,那么都没有问题,但是如果这是个公共账户,就可能有多个人同时取款。这时,取款的操作结果可能就不是预期的那样了。因为withdraw里,必须先获取账户余额,然后减去输入参数,也即取走的款,然后将此值再赋值给账户函数,如果多个withdraw同时执行,上述的取款——修改——赋值操作的顺序将不确定,结果也即不确定了。A获取到的账户余额是100,此时B也正好获取账户,那么也是100;A在操作结束赋值后,假设为90,然后B也操作结束再次赋值假设为80。结果就是A、B两人进行取款操作,但是账户的效果就像是只有B取款了,A白白多得了些钱。

    多个进程共享某个状态变量的情形下,保证并发程序的正确行为,必须对程序的并发执行增加限制。其中一个限制是:不允许修改任意共享状态变量的操作同时发生。也就是上例中,不允许A、B两个进程同时执行withdraw函数。

    通过串行化的方式,来限制某些进程的执行顺序。每个过程可以分成多个步骤,这些不同步骤有的可能涉及共享状态的获取和改变,这些要是限制的;某些不涉及共享状态变量,是可以并行执行的。串行化就是创建一些过程集合,每个集合中的过程在同一时刻将那些涉及共享状态访问的步骤

0 0
原创粉丝点击