一道考研 408 的真题

2018-12-08 12:33:27 +08:00
 wisej

第 25 题

标答是 B,解析就是说先 thread1 全部执行完,或者 thread2 先全部执行完

我的困惑:当 thread1 只执行了前两条汇编指令,然后时间片用完,切到 thread2,最后 x 的值不也是 2 么?

而且题目也说了是,所有可能的指令执行序列中

3050 次点击
所在节点    操作系统
9 条回复
geelaw
2018-12-08 12:46:24 +08:00
题主想象的序列结果是 1。

结果是 2,当且仅当后出现的 move from x 能够读到 1,当且仅当那个时候 x 已经是 1,当且仅当那之前有一个 move to x,又因为两个线程都是 move from x 是第一个指令,move to x 是最后一个指令,所以当且仅当一个线程的最后一个指令在另一个线程的第一个指令之前发生,当且仅当一个线程在另一个开始之前完成。
visitant
2018-12-08 12:51:54 +08:00
问题的关键在于自增的操作是在寄存器内完成的,而两个线程第一步的操作都会是从内存取 x 的值,在任何一个线程未完成时,内存中的值是不会变的,所以只有某一线程完成,另一线程才会取到 1,否则两个线程都是在 0 的基础上自增 1
nolo
2018-12-08 12:53:14 +08:00
当 thread1 只执行了前两条汇编指令,然后时间片用完,切到 thread2,最后 x 的值不也是 2 么?
-----------------
thread1 执行两条指令后,此时变量 x 还是 0,R1 寄存器尚未写入到变量 x。即使切到 thread2,最后 x 的结果还是 1.
kx5d62Jn1J9MjoXP
2018-12-08 13:09:46 +08:00
想要结果为 2, 其中一个寄存器的读入值必须是 1, 也就是要另一个线程三步全部走完将 1 写回到 x 之后才能开始
wisej
2018-12-08 13:36:57 +08:00
@geelaw
@visitant
@nolo
@ssynhtn

谢谢大家!我自己没审清题,我想着 x 初值是 1...
rayhy
2018-12-08 14:05:59 +08:00
考浙大吗?我做了逃兵,楼主加油。
wisej
2018-12-08 15:59:39 +08:00
@rayhy 不是呀 你也加油
UxCZbWShjEsL
2018-12-08 16:55:34 +08:00
考完一年了,现在看到题目看下去的耐心都没了……
anonymous256
2018-12-08 17:22:02 +08:00
题目挺好的,治好了我多年的颈椎病。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/515601

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX