为什么要同步
8.1、为什么要同步 线程之间是合作关系。既然是合作,那就要由某种约定的规则,否则合作就会出现问题。 例子1 : 有两个线程同时运行,第一个线程在执行了一些操作后想检查当前的错误状态errno,但在其做检查之前,线程2却修改了errno。这样,当第一个线程再次获得控制权后,检查结果将是线程2改写过的errno,而这是不正确的。 线程1 线程2 。。。。。 。。。。 读errno变量 。。。。 。。。。 写errno变量 从读操作返回 。。。。 检查errno值 。。。。 一个进程的两个线程因为操作不同步而造成线程1运行错误。 之所以出现上述问题,是基于两个原因: l errno是线程之间共享的全局变量 l 线程之间的相对执行顺序是不确定的 因此,要解决上述问题有两个办法,即分别消除上述两个原因。消除第1个原因的办法就是限制全局变量,给每个线程一个私有的errno变量。事实上,如果可以将所有的资源都私有化,让线程之间不共享,那么这种问题就不复存在。 但问题是,如果所有资源都不共享,那么还有必要发明线程吗?甚至也没有必要发明进程了。因为这样就违背了进程和线程设计的初衷:共享资源、提高资源利用率。因此,这种解决办法是不切实际的。 那剩下的办法就是消除第2个原因,即让线程之间的相对执行顺序在需要的时候可以确定。 例子2 : 有两个线程A和B,分别执行指令x=1和x=2,即 线程A:x=1;