操作系统笔记之临界区

请添加图片描述

code review!

1.一句话描述临界区

临界区(Critical Section)是指进程或线程中访问共享互斥资源的那段必须互斥执行的代码

2.另外一句话描述临界区

临界区是指进程或线程中访问共享资源(如共享变量、文件等)的一段代码,为避免竞态条件,任意时刻只允许一个进程/线程进入执行。

3.示例

以下是一个使用 C 语言 + POSIX 线程(pthread)互斥锁实现临界区保护的极简完整示例:

#include <stdio.h>
#include <pthread.h>

int counter = 0;                      // 共享资源
pthread_mutex_t lock;                 // 互斥锁

void* increment(void* arg) {
    pthread_mutex_lock(&lock);        // 进入临界区
    counter++;                        // 访问共享资源
    pthread_mutex_unlock(&lock);      // 离开临界区
    return NULL;
}

int main() {
    pthread_t t1, t2;
    pthread_mutex_init(&lock, NULL);

    pthread_create(&t1, NULL, increment, NULL);
    pthread_create(&t2, NULL, increment, NULL);

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    printf("counter = %d\n", counter); // 输出结果应为 2
    pthread_mutex_destroy(&lock);
    return 0;
}

说明:

  • counter 是两个线程共享的资源。
  • pthread_mutex_lockpthread_mutex_unlock 之间的代码就是临界区
  • 互斥锁保证任意时刻只有一个线程能执行 counter++,避免竞态条件,确保最终结果正确为 2

4.临界区和共享资源的区别

4.1.共享资源(Shared Resource)

多个进程或线程可以同时访问的数据或设备,例如:全局变量、文件、打印机、数据库记录等。它是一种"资源",是被访问的对象

4.2.临界区(Critical Section)

访问共享资源的那段代码,例如对全局变量进行读写操作的代码块。它是一段代码/程序执行区域,是访问共享资源的过程

4.3.核心区别

对比点 共享资源 临界区
本质 数据/对象(名词) 代码段/操作(动词性)
作用 被多个线程/进程共享使用 用来访问共享资源
关注点 "是什么"被共享 "怎么"安全地访问

4.4.一句话总结

共享资源是"被保护的对象",临界区是"保护这个对象的那段代码"。 临界区存在的目的,就是为了安全地访问共享资源,避免多个线程同时操作导致数据不一致(竞态条件)。

举例:银行账户余额 balance 是共享资源;而执行 balance = balance - amount; 这行取款代码,就是临界区——必须保证同一时刻只有一个线程能执行它。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐