0

我有一个关于虚假分享的观察,请看这段代码:

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应该是无关紧要的。

通过甲骨文的网站,我读到了这个解释:

来自不同处理器的同一高速缓存行中的单个元素同时更新会使整个高速缓存行无效,即使这些更新在逻辑上彼此独立。缓存行的单个元素的每次更新都会将该行标记为无效。访问同一行中不同元素的其他处理器会看到标记为无效的行。他们被迫从内存或其他地方获取该行的更新副本,即使访问的元素尚未修改。这是因为缓存一致性是在缓存行的基础上维护的,而不是针对单个元素。因此,互连流量和开销将会增加。此外,当缓存行更新正在进行时,对行中元素的访问被禁止.

我的观察很简单:
如果我读的是真的,怎么可能存在“脏读”的问题???

4

0 回答 0