0

I have an observation about false sharing, please look this code:

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

Here, sum_a may need to continually re-read x from main memory (instead of from cache) even though inc_b's concurrent modification of y should be irrelevant.

By Oracle's website I read this explanation:

simultaneous updates of individual elements in the same cache line coming from different processors invalidates entire cache lines, even though these updates are logically independent of each other. Each update of an individual element of a cache line marks the line as invalid. Other processors accessing a different element in the same line see the line marked as invalid. They are forced to fetch a more recent copy of the line from memory or elsewhere, even though the element accessed has not been modified. This is because cache coherency is maintained on a cache-line basis, and not for individual elements.As a result there will be an increase in interconnect traffic and overhead. Also, while the cache-line update is in progress, access to the elements in the line is inhibited.

My observation is simple:
if what i read is true, how can be possible that exist the problem about "dirty read" ???

Rob S.
  • 1,044
  • 7
  • 25
Giovanni Far
  • 1,623
  • 6
  • 23
  • 37

0 Answers0