首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  操作系统

一道考研 408 的真题

  •  
  •   wisej · 167 天前 · 1064 次点击
    这是一个创建于 167 天前的主题,其中的信息可能已经有所发展或是发生改变。

    第 25 题

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

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

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

    第 1 条附言  ·  167 天前
    -------------------------------------------------------

    初值为 0,自己没审好题
    9 回复  |  直到 2018-12-08 17:22:02 +08:00
        1
    geelaw   167 天前   ♥ 1
    题主想象的序列结果是 1。

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

    谢谢大家!我自己没审清题,我想着 x 初值是 1...
        6
    rayhy   167 天前 via Android
    考浙大吗?我做了逃兵,楼主加油。
        7
    wisej   167 天前
    @rayhy 不是呀 你也加油
        8
    UxCZbWShjEsL   167 天前 via iPhone
    考完一年了,现在看到题目看下去的耐心都没了……
        9
    anonymous256   167 天前 via Android
    题目挺好的,治好了我多年的颈椎病。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2410 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 16ms · UTC 02:55 · PVG 10:55 · LAX 19:55 · JFK 22:55
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1