我正在阅读有关 MESI 协议的内容,如果我们对每个写入操作都具有独占访问权限,从而导致其他内核缓存中的缓存行无效,那么为什么会出现数据竞争?在这个例子中:
CYCLE # CORE 1 CORE 2
0 reg = load(&counter);
1 reg = reg + 1; reg = load(&counter);
2 store(&counter, reg); reg = reg + 1;
3 store(&counter, reg);
据说总体结果是变量仅增加一次,而两个内核都尝试增加它(结果预计为两个)。所以问题是,如果在写入操作期间,两个内核都请求独占访问缓存行(因此其他内核“等待”轮到他们修改并因此也获得独占访问)为什么该变量存在数据竞争?