关于虚假分享的观察

时间:2015-10-23 19:49:23

标签: caching false-sharing dirtyread

我有关于虚假分享的观察,请查看此代码:

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; ???

0 个答案:

没有答案