Skip to content

2016年 408 操作系统 第 30 题

操作系统2016年选择题2分

题目

进程 P1 和 P2 均包含并发执行的线程,下列选项中,需要互斥执行的操作是( )。

进程P1

c
int x = 0;
Thread1()
{
    int a;
    a = 1; x += 1;
}
Thread2()
{
    int a;
    a = 2; x += 2;
}

进程P2

c
int x = 0;
Thread3()
{
    int a;
    a = x; x += 3;
}
Thread4()
{
    int b;
    b = x; x += 4;
}

错因

A

a = 1a = 2 操作的是各线程自己的局部变量 a——它们在线程栈上独立存在,分别是 Thread1 的 a 和 Thread2 的 a,根本不是同一个变量。两个独立的局部变量不存在并发冲突,互斥也无意义。

B

a = x(Thread3)和 b = x(Thread4)都是只读 x 不写——两个并发读没有竞态。竞态发生在"至少有一方写"的场景;只读不需要互斥。把"两个线程都碰了 x"误以为是冲突,但读读组合是安全的。

D

x += 1(P1 的 Thread1)和 x += 3(P2 的 Thread3)看似都修改 x,但这两个 x 是不同进程里的不同变量——P1 和 P2 是不同进程,各自有独立的地址空间,名字相同的全局变量在物理上不共享。改 P1 的 x 跟 P2 的 x 没关系。

总解析

互斥的前提是多个并发执行流真正访问同一份共享内存,且至少一方写

进程 vs 线程对共享的影响

关系共享什么不共享什么
同一进程内的两个线程全局变量、堆、代码段各自的栈(局部变量在栈上)
不同进程之间(除非显式 IPC / mmap)什么都不共享各自独立的虚拟地址空间

逐项分析

选项涉及变量真共享?都修改?需要互斥?
A a=1a=2线程局部变量 a(栈上各自一份)✗ 各自独立
B a=xb=x共享 x(同进程 P2 的全局),但只读✓ 共享✗ 都只读
C x+=1x+=2同进程 P1 的全局 x✓ 共享✓ 都改✓ 需要
D x+=1x+=3P1 的 x 和 P2 的 x,两个不同变量(不同进程的全局名字相同但物理隔离)✗ 不共享

判定原则:互斥需要同一份内存 + 写并发。同一进程内的全局变量是真共享、写并发要互斥;不同进程的同名全局变量物理上各自一份,不存在共享。

C 是唯一既共享又有写并发的——x += 1x += 2 都对 P1 的全局 x 做"读-改-写",不互斥可能丢失更新(典型的竞态:两个线程都读到 0,分别写 1 和 2,最终结果丢失一次加法)。

最终答案是 C

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数