我有关于虚假分享的观察,请查看此代码:
struct foo {
int x;
int y;
};
static struct foo f;
/* The two following functions are running concurrently: */
int sum_a(void)
{
int s = 0;
int i;
for (i = 0; i < 1000000; ++i)
s += f.x;
return s;
}
void inc_b(void)
{
int i;
for (i = 0; i < 1000000; ++i)
++f.y;
}
此处,
sum_a
可能需要不断从主内存中重新读取x
(尽管inc_b
并发修改了(而不是缓存)y
应该无关紧要。
在甲骨文的网站上,我读到了这个解释:
同时更新同一缓存行中的各个元素 来自不同处理器的处理器甚至会使整个缓存行无效 虽然这些更新在逻辑上彼此独立。每 更新缓存行的单个元素将该行标记为 无效。其他处理器访问同一个中的不同元素 行看到标记为无效的行。 他们被迫取得更多 最近从内存或其他地方复制的行,即使是 访问的元素尚未修改。这是因为缓存 一致性是在缓存行的基础上维护的,而不是针对个人的 因此,互连流量和开销将会增加。此外,在缓存行更新正在进行时,禁止访问该行中的元素。
我的观察很简单:
如果我读到的是真的,怎么可能存在关于&#34;脏读&#34; ???