【问题标题】:Race condition scenario竞争条件场景
【发布时间】:2012-06-19 02:13:16
【问题描述】:

我有一个关于比赛条件场景的问题。问题:

考虑以下两个线程,在共享中并发运行 内存(所有变量在两个线程之间共享)。

Thread A 
for i = 1 to 5 do 
  x = x + 1;

Thread B 
for j = 1 to 5 do
  x = x + 1;

假设一个单处理器系统,加载和存储是原子的, x 初始化为 0,并且 x 必须加载到寄存器中 在递增之前(然后存储回内存),什么 两个线程都完成后 x 的所有可能值是多少?

现在答案是 2:10(含 2:10)。我理解 5:10 的结果,但 x 怎么可能是 2、3 或 4?

【问题讨论】:

    标签: c concurrency parallel-processing


    【解决方案1】:

    得到 x = 2 的序列:

    Thread 2 read // Reg_2 = 0
    Thread 1 read/write 4 times // x = 4
    Thread 2 write // * Reg_2 = 0 --> x = 1
    Thread 1 read // Reg_1 = 1
    Thread 2 read/write 4 times // x = 5
    Thread 1 write // Reg_1 = 1 --> x = 2
    

    根据你在标有 * 的步骤抢占之前写线程 2 做了多少次,你会得到 3 和 4 的结果。

    【讨论】:

    • 嗨@nhahtdh 我不明白你应用的逻辑。请提供一些链接以了解底层逻辑。还有线程 2 是如何读/写 4 次的,而线程 1 是读一次的。你能帮帮我吗
    • @rakeshNS:您知道 x = x + 1 涉及将 x 的值读取到寄存器,然后(进行计算,并)将新值写入表示变量 x 的内存(读取先于写入)。两个线程的读/写总数为 5。线程之间的上下文切换将值保留在每个线程的寄存器中,但是由于两个线程的内存中 x 的位置相同,因此当线程在读取之间切换时会发生问题/写。
    猜你喜欢
    • 2013-08-26
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2022-01-23
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多