[TOP]
什么是临界区保护?
临界区(critical region)是指一段特定的代码行为集合,其中可能包括对数据的修改,执行一段特定逻辑等等。
临界区的概念是因为并发编程(multiprogram)的出现导致的,当出现多个task、多个cpu、甚至网络中多个服务器对同一个逻辑对象操作时,就会有条件竞争出现,如果设对该逻辑对象的操作为A,此时必须对A做特殊保护,约定对这A的这种特殊保护统称为临界区保护(mutex exclue),称A操作的范围为临界区。
临界区不保护会出现什么问题?
举例说明,假设有两个task都执行如下代码:
// p is a global var
// ...
if (p == NULL) {
p = malloc(N);
}
// .do some thing
free(p);
这里至少有两个问题:
- 假设任务1和任务2都同步走到判断p是否为NULL的语句,两个任务均判断p为NULL,接着1先分配内存,紧接着2又重新给p分配内存,导致1任务内存泄漏
- 1任