race-condition - 共享变量 x 的可能结果值

标签 race-condition

如果我们有两个具有共享变量 x 的不同进程,那么当两个进程都完成时 x 的可能值是多少?

进程 A 正在运行以下 for 循环:

for (i = 0; i < 5; i++)
    x++

进程B正在运行:

for (j = 0; j < 5; j++)
    x--

我想说 x 可以是 -5 到 5 之间的任何值,假设 x 初始化为 0。这是真的吗?请附上解释。

最佳答案

假设编译器将生成一条递增x++或递减x--的指令,则它将具有与执行for循环之前相同的值两个线程都完成了,为 0。

否则,让我们看下面的例子:

x++:
1. MOV R1, x     //register R1 receives x
2. INC R1        //register R1 is incremented
3. MOV x, R1     //store decremented x back to the memory

x--:
1. MOV R1, x     //register R1 receives x
2. DEC R1        //register R1 is decremented
3. MOV x, R1     //store decremented x back to the memory

现在很明显,如果一个线程在执行第 1 行后失去 CPU,它将有一个未更新的值,这将导致竞争条件,并且该变量将具有 -5 和 + 之间的任何值正如您所指出的,两个线程完成执行后,如图 5 所示,这取决于两个线程可以具有的不同执行顺序。

关于race-condition - 共享变量 x 的可能结果值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19254229/

相关文章:

C# 多线程和重新排序 - 这里发生了什么?

c - 使用用户输入在 C 中跨线程同步数据

c++ - 生产者/消费者堆栈中竞争条件的原因

c - 使用信号量避免竞争条件

multithreading - 这种解决竞争状况的解决方案是什么?

java - 不可变对象(immutable对象)如何帮助防止竞争条件

mysql - 避免 Django 中自定义 get_or_create 的竞争条件?

android - Android 对话框回答太快时代码未执行(竞争条件)

c# - 多线程多个生产者和使用者线程不会同步BlockingCollection争用条件