'i'可能的结果数

L.p*_*ppt 1 c c++ operating-system processor

int i=5;
f()
{
    i++;
    i--;
}
Run Code Online (Sandbox Code Playgroud)

对于上面的代码,如果三个线程f()同时执行上述函数,那么全局变量的总不同值i是可能的呢?

注意:i初始化为5全局.

Ton*_*ion 9

我会说这是组合学中的一个练习,我个人不打算这样做,但我确实想说明这不是让线程执行它的正确方法f().问题是实现operator++不是单个指令,这意味着在一次调用中途operator++可以进行上下文切换并f()在另一个线程中执行另一个指令.这将导致变量的损坏状态i.

因此,确定i没有正确同步的可能值是没有用的,因为它可能是任何数量的值,真实的或不真实的,因为事情可能会腐败.


jb.*_*jb. 6

假设++运算符被定义为指令:

1) Load the memory location holding i into register A. 
2) Add one to the value stored at register A. 
3) Store register A back into memory holding i."
Run Code Online (Sandbox Code Playgroud)

现在我们有3个线程,因为没有同步工具,所以无法保证操作系统何时在这些线程之间进行上下文切换.

所以这是一个可能的场景.

1)线程1将i加载到寄存器A中.寄存器A保持值5.

2)线程1向寄存器A添加一个.寄存器A现在保持值6.

3)OS上下文切换到线程2.

4)线程2将i从存储器加载到寄存器A中,覆盖那里的先前值.寄存器A现在保持值5.

5)线程2向寄存器A添加一个.寄存器A现在再次保持值6.

6)线程2将寄存器A存储回变量i的存储器中.我持有价值6.

7)OS上下文切换回线程1.

8)线程1从它停止的地方继续,将寄存器A存储回变量i的存储器中.我仍然保持价值6.

在这里,我们"成功"运行了两个完整的增量运算符,并且只导致向变量添加一个值.哦多线程的危险......

  • 还要注意(如果所涉及的值较大)写入也不是原子的,如果一个线程保存257,另一个8,则结果为264! (2认同)