目前我试图提高我对内存屏障、锁和内存模型的理解。
据我所知,存在四种不同类型的放松,namley Write -> Read,Write -> Write,Read -> Write 和 Read -> Read。x86 处理器只允许写入->读取松弛,这通常称为总存储顺序 (TSO)。部分存储顺序 (PSO) 允许进一步的写入->写入松弛,而松弛存储顺序 (RSO) 允许上述所有松弛。
此外,还存在三种类型的内存屏障:释放、获取和两者一起使用。锁可以只使用获取和释放障碍,有时也可以使用完全障碍(.Net)。
现在考虑以下示例:
// thread 0
x = 1
flag = 1
//thread 1
while (flag != 1);
print x
我目前的理解告诉我,如果我在 TSO 机器上运行此代码,我不需要额外的内存屏障。如果它是一台 PSO 机器,我需要在 x=1 和 flag = 1 之间设置一个释放屏障,以确保线程 1 在 flag =1 的情况下获得 x 的实际值。如果它是 RSO 机器,我需要在 while(flag != 1); 之间进一步设置一个获取障碍;并打印 x 以防止线程 1 提前读取 x 的值。
我的观察正确吗?