【发布时间】:2013-11-01 23:18:06
【问题描述】:
我参加了考试,我在考试中遇到了这个问题:
对于以下每个陈述,用一句话说明该陈述是否是 是真是假,为什么。 • 在提供非抢占式调度线程的并发编程环境中(即, 没有非自愿的上下文切换),不需要互斥同步。
考试后我得到的答案是:
[错误。互斥同步仍然需要 (1) 在多处理器上和 (2) 在单处理器上 对于包含阻塞操作的关键部分。]
但我无法理解。谁能解释清楚?
【问题讨论】:
标签: operating-system
我参加了考试,我在考试中遇到了这个问题:
对于以下每个陈述,用一句话说明该陈述是否是 是真是假,为什么。 • 在提供非抢占式调度线程的并发编程环境中(即, 没有非自愿的上下文切换),不需要互斥同步。
考试后我得到的答案是:
[错误。互斥同步仍然需要 (1) 在多处理器上和 (2) 在单处理器上 对于包含阻塞操作的关键部分。]
但我无法理解。谁能解释清楚?
【问题讨论】:
标签: operating-system
在多处理器系统的情况下,例如,您有 2 个任务同时运行并共享一个变量 s:
s = 1;
T1 reads s1 = 1;
T2 reads s2 = 1;
T1 increments s1: s1 = 2;
T2 increments s2: s2 = 2;
T1 writes s: s = s1 = 2;
T2 writes s: s = s2 = 2;
但现在 s 应该是 3,因为两个任务将它加一。为了防止这种情况,您必须确保在另一个任务读取变量之前读取、操作和写入变量。
在单处理器系统上,同样的情况也可能发生:
T1 reads s;
T1 blocks on an operation;
T2 runs and reads s;
T2 blocks on an operation;
T1 manipulates and writes;
T2 manipulates and writes;
s被操纵了两次,但结果只显示了对T2的操纵。
如果您只更改单个变量,您可以使用原子操作。但是,如果您的关键部分较大,则必须使用互斥锁来保护它。
【讨论】: