0

假设在 x86-64 架构中,有 2 个核心,每个核心都有一个线程在做这样的事情:比较并交换一个共享值(测试共享值,如果它是 0,则更改为 1),然后做其他事情,之后,再次将值设置为 0(在循环中),就像一个简单的自旋锁。我有一个问题,如果core-1将值设置为1,core-2等待忙(测试值),然后core-1将值设置为0,cpu可能会在时间轴上做这样的事情(当core-1 将 val 设置为 0):

time 0: core-1 set the new value to store buffer, and send "read invalidate" message to core-2
time 1: core-2 got msg and save it to invalidate queue, send ACK to core-1
time 2: core-1 got ACK flush store buffer
time 1.5 or 2.5 : core 2 flush invalidate queue

所以如果在 0.5 时间,core-1 再次读取了这个值,所以它可以得到更新的数据,但是 core 2 仍然得到了脏数据,这是我的猜测,那么它会不会像这样发生呢?如果“是”,如何解决问题?我认为内存屏障或 LOCK 总线不会有任何帮助,此外,c++11 std::atomic 值是否有这样的问题?

4

0 回答 0