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全局.
我会说这是组合学中的一个练习,我个人不打算这样做,但我确实想说明这不是让线程执行它的正确方法f().问题是实现operator++不是单个指令,这意味着在一次调用中途operator++可以进行上下文切换并f()在另一个线程中执行另一个指令.这将导致变量的损坏状态i.
因此,确定i没有正确同步的可能值是没有用的,因为它可能是任何数量的值,真实的或不真实的,因为事情可能会腐败.
假设++运算符被定义为指令:
Run Code Online (Sandbox Code Playgroud)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."
现在我们有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.
在这里,我们"成功"运行了两个完整的增量运算符,并且只导致向变量添加一个值.哦多线程的危险......