生活中运行的各种工作, 有的工作相对独立, 与别的工作无关, 有的工作间却存在密切的相关性。 如我们熟悉的抢椅子游戏、 4 乘100 接力等, 抢椅子的人存在对椅子资源的竞争关系, 而一组接力赛跑的人则存在顺序合作的关系。 运行在系统中的多道进程在计算机系统中运行, 也存在竞争资源和合作执行的关系, 而如果这些关系处理不好, 很容易造成进程执行结果出现错误。
前面我们学习了进程和线程的编程, 但并没有碰到突出的同步问题。 下面通过一个例子体验一下没有同步控制下的程序会有什么错误。
【例5-12】 两个线程共同对它们共享的进程变量做加1 操作, 最后却加错了结果。
代码功能很简单, 主进程定义了三个变量x、 y、 z, 主进程运行产生的两个线程共享这些变量, thread1 和thread2 分别持续对x 和y 做加1 操作, 但同时两者每次做加法, 也对z 做累加1 的操作。 主线程睡眠1 秒后打印输出结果, 然后进程结束。(www.daowen.com)
分析x、 y 的输出结果, 两线程获得的CPU 时间不确定, 所以加法做的次数不同, x不等于y 没什么问题; 但在每次x 加1、 y 加1 时, 它们也都使z 加1 了, 正常逻辑下z 的值和x+y 的值应是相等的, 但是, 输出结果显示z 的结果却不对。
问题实际上出在双方对z 的共同操作上。 对z 的加法操作在系统底层涉及从内存取到寄存器、 再在寄存器累加、 再保存回变量的内存的过程。 两个线程都对z 变量的内容做加法, 由于线程并发执行, 它们的加法操作相互穿插, 难免出现其中一个的加法是在另一个加到一半的基础上做的, 在错误的基础上做工作很容易出现错误的可能。 解决的办法就是, 需要提供控制手段, 在多方对某种共享资源具有竞争关系时, 保证只有一个使用者用完资源后另一个才能使用, 这就是典型的资源互斥处理问题。
同理, 如果我们需要thread1 对z 做加法加到十万后再由thread2 做累乘2, 控制程序的接力顺序也是需要处理的。 总之, 无论是多个进程还是多个线程之间, 只要存在同步问题, 都需要有同步控制才能保证程序运行结果的逻辑正确。 操作系统提供的同步控制方法软硬件手段都有, 下面我们学习不同的库接口支持下的同步实现。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。