另一方面,完全围栏只应该禁用指令重新排序和缓存,它的声音不符合线程阻塞的条件,(与锁定不同的是,它清除该线程等待其他人在继续之前释放锁定,并在此期间被阻止)时间)
关于那个线程’阻止状态’.我说的不是线程是否被置于阻塞状态...解决方法:
指令花费时间执行的事实并不意味着线程被阻止.当一个线程被特定地置于阻塞状态时被阻塞,而MemoryBarrier()不会这样做....实际上阻止指令重新排序和缓存刷新的处理器指令需要时间,因为它们必须等待缓存再次变得连贯.在此期间,线程仍被视为正在运行.
更新:让我们看看示例中实际发生了什么,以及每个内存屏障实际上做了什么....Barrier 2确保将true的写入刷新到内存,而barrier 3确保在测试_complete的值之前刷新读取cahces....,指令以正确的顺序发生.