知了常识站
白蓝主题五 · 清爽阅读
首页  > 电脑基础

进程同步与互斥:多任务下的资源争夺战

你有没有遇到过这样的情况:两个人同时用电脑记账,结果同一笔钱被删了两次?或者多人编辑同一个文档,改来改去内容全乱了?这背后其实就涉及到操作系统里的一个核心问题——进程同步与互斥。

什么是进程互斥

当多个进程都想使用同一个资源,比如打印机、文件或内存区域时,不能让它们同时操作,否则数据就会出错。这种“一次只能有一个进程使用”的规则,就叫互斥。

就像办公室里只有一台打印机,A同事在打印合同时,B同事就不能插队打印简历,否则两张纸混在一起,谁都拿不到完整的文件。只有等A打完,B才能接着用。这个“排队等”的机制,在程序里就得靠互斥锁来实现。

用代码看个例子

常见的实现方式是使用信号量(Semaphore)或互斥量(Mutex)。下面是一个简单的互斥访问共享变量的示意:

#include <pthread.h>\n#include <stdio.h>\n\nint balance = 100; // 账户余额\npthread_mutex_t lock; // 定义互斥锁\n\nvoid* withdraw(void* amount) {\n    pthread_mutex_lock(&lock); // 加锁\n    balance -= *(int*)amount;\n    printf("取款后余额:%d\n", balance);\n    pthread_mutex_unlock(&lock); // 解锁\n    return NULL;\n}

如果没有 pthread_mutex_lockpthread_mutex_unlock 这对操作,两个线程同时取钱,可能都读到100元,各自减掉50,最后只剩50,而不是该有的0元。加了锁,就能保证操作是原子的,不会被打断。

同步:不只是抢,还要配合

互斥解决的是“不能同时干”的问题,而同步解决的是“什么时候才能干”。比如生产者往队列里放数据,消费者要等有数据了才能取。这不是抢资源,而是协调节奏。

好比做三明治:必须先放面包,再放肉,最后盖上面包。如果顺序乱了,或者少了一步,三明治就不成立。进程之间也得这样一步步配合,这就需要同步机制,比如通过信号量控制执行顺序。

常见问题场景

银行转账是最典型的例子。从A账户转500到B账户,包含两个动作:A减500,B加500。如果系统没做好同步,中途被另一个进程插进来查余额,可能看到A已经扣钱但B还没到账,以为钱丢了。这就是所谓的“中间状态”被暴露。

为了避免这类问题,操作系统提供了多种工具:信号量、管程、条件变量等。它们的本质都是让进程在关键操作上“排队”或“等待通知”,确保逻辑完整。

现代多核CPU下,进程和线程并行运行成了常态。没有同步与互斥,再多的性能提升也会被混乱的数据拖垮。写程序时多加一把锁,看着麻烦,其实是给系统上了保险。