我参加了考试,我在考试中遇到了这个问题:
对于下面的每个陈述,用一句话表明陈述是否是 是真还是假,为什么。 •在提供非抢占式调度线程的并发编程环境中(即, 没有非自愿的上下文切换),不需要互斥同步。
考试结束后我得到了答案:
[假。在多处理器上仍然需要互斥同步(1),以及(2)在单处理器上 对于包含阻塞操作的关键部分。]
但我不能忍受它。任何人都可以清楚地解释清楚吗?
答案 0 :(得分:2)
如果是多处理器系统,您可以同时运行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;
被操纵了两次,但结果只显示了对T2的操纵。
如果只更改单个变量,则可以使用原子操作。但是,如果您的关键部分较大,则必须使用互斥锁来保护它。