7 c#
class StopIt
{
private bool stop;
void Loop()
{
while (!stop)
{
// work
}
}
void Stop()
{
stop = true;
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,如果Loop方法在一个线程中运行而Stop从另一个线程调用,那么操作是否会正常停止?我知道bool读/写是原子的.但是,这够了吗?如果线程循环没有立即停止,则会出现问题.我应该标记停止挥发吗?
Jon*_*eet 10
是的,你绝对应该标记stop为不稳定.
原子性是不够的 - 它不能保证一个线程将"看到"另一个线程所做的更改.
虽然我的理解volatile目前正在进行一些手术,但您可以粗略地将对易变量的写入视为"确保其他人可以立即看到这一点!" 并从易失性变量读取"我想看到最新值!"
在没有使用stopvolatile的情况下,即使Stop()在不同的线程中调用,该循环也可以永久进行.基本上JIT可以合理地将变量读入寄存器,然后永远只读取寄存器.
事实上,如果"工作"涉及调用非内联方法,我认为JIT目前无论如何都被迫进行易失性读取,但这只是当前的实际限制...... 理论上说你应该让它变得不稳定.
| 归档时间: |
|
| 查看次数: |
196 次 |
| 最近记录: |