- 论坛徽章:
- 11
|
本帖最后由 zylthinking 于 2011-10-18 14:44 编辑
我自己推测出一个答案, invalid request 发出时机很可能在内存看到值改变的那一瞬间。 理由是 rmb 的实现基本山都是 invalid cpu1 的 memory cache, 下一次去内存取新值, 那么如果 cpu1 很快去取, 而内存还没有准备好的话, 那就挂了。
但这样推断另一个问题就来了, 首先寄存器到内存的写, 是汇编级别的, 而不是cpu内部实现,
一般写操作, mov memory, register; register++; mov register, memory
cpu不可能知道寄存器对应的内存地址, 更不可能跨越程序员肉眼可见的汇编指令直接写到内存;-----有点明白了, 但不清楚对不对, 其实 invalid request 发出时机是执行 mov register, memory 时在 cpu 内部发出的? 或者说的绝对些, 就是写端口完毕后, 发出的???
而如果 invalid request 发出时机是写寄存器, 那么 cpu1 要么无法感知新值; 要么, 在 invalid request中带着新值, 即便带着新值, 一个非常容易出现的情景即可驳斥这种假设, 两个线程对同一个变量自加, 如果 invalid request 带着新值, 则这两个线程就没必要用锁之类的手段保护了 |
|