一、竞争条件和临界区
在同一个应用程序中运行多个线程本身并不会引起问题。当多个线程访问相同的资源时才会出现问题。比如多个线程访问同一块内存区域(变量、数组、或对象)、系统(数据库、 web 服务等)或文件。事实上,只有一个或多个线程改写这些资源时才会出现问题。多个线程只读取而不会改变这些相同的资源时是安全的。
两个线程访问同一个资源而且与线程访问资源时的顺序有关的这样一种情形就叫竞争条件。 导致竞争条件发生的代码片段就叫临界区。在临界区中可以通过恰当的线程同步来消除竞争条件。
当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞争条件。导致竞争条件发生的代码称作临界区。
对共享内存进行访问的程序片段称作临界区。
对于一个好的实现互斥的解决方案,需要满足以下4个条件:
1) 任何两个进程不能同时处于其临界区。
2) 不应对CPU的速度和数量做任何假设。
3) 临界区外运行的进程不得阻塞其他进程。
4) 不得使进程无限期等待进入临界区。
二、忙等待的互斥
竞争条件:两个或多个进程读取某些共享数据,最后的结果取决于进程运行的精确时序,成为竞争条件。
互斥:当一个进程在使用一个共享变量或文件时,其他进程不能做同样的操作。
临界区:对共享内存进行访问的程序片段成为临界区。
实现互斥,避免竞争条件的方法:
1 屏蔽中断
在单处理器系统中,最简单的方法是使每个进程在刚刚进入临界区后立即屏蔽所有中断,并在就要离开之前再打开中断。屏蔽中断后,时钟中断也被屏蔽。CPU只有发生时钟中断或其他中断时才会进行进程切换,这样,在屏蔽中断之后CPU将不会被切换到其他进程。于是,一旦某个进程屏蔽中断之后