多线程的问题
在多线程应用中,子线程一定会修改某些公共资源(包括全局变量、磁盘文件等),这样很有可能会影响其它子线程。由于不同线程是并行执行的,有可能某个时刻某个线程对公共资源进行了部分修改,此时公共资源是无效的,CPU 切换到另一个线程执行并访问此公共资源,这样将有可能造成巨大灾难。
要解决此问题,就应该使需要相同公共资源的不同线程不能同时执行,所以多线程问题分析的基础是互斥。
线程同步和线程互斥
线程间的关系可以分为无关和相交两种。当多个线程无关的时候,其中某个线程的启动不会依赖于另一个线程,它们启动和完成的先后顺序也没有特别要求,所以不需要任何机制来控制和协调它们运行,这是最简单的情况;而相交线程之间则较为复杂,有可能某个线程的启动依赖于另一个线程的完成,也有可能某个线程的完成达成另一线程启动的条件,这时就需要一些机制来控制和协调它们运行。
根据线程执行的先后顺序要求的不同需要用到线程同步和线程互斥。如果某个线程需要用到另一线程的运行结果,那么此线程应该让其先启动并完成后才启动,这种情况下的两个线程执行的先后顺序是有严格要求的,乱序就会出问题,此时就应该使用线程同步;如果两个线程仅仅访问相同的公共资源,而不是一个线程的启动依赖于另一个线程的完成,这种情况下的两个线程执行的先后顺序没有严格要求,谁先谁后无所谓,此时就应该使用线程互斥。
线程同步是一种更为复杂的线程互斥(即: 线程执行的先后顺序有严格要求的互斥)。在考虑选择线程同步还是线程互斥的时候,思考一下线程执行的先后顺序是否有严格要求即可作出正确选择。