C# 正确使用记忆屏障

C# 正确使用记忆屏障,c#,.net,multithreading,barrier,C#,.net,Multithreading,Barrier,我试图了解记忆障碍是如何工作的,它们有多有用。我知道,在大多数情况下,它们不值得让我的代码复杂化,但这仍然是一个有趣的话题。试图围绕它建立一个心智模型,但我还没有完全成功 我可能已经成功地理解了release并获得了足够的知识,能够正确地,或者至少更正确地,使用或理解volatile字段。我的问题是使用完整的内存屏障。例如,以下是一些描述的链接: 在名为“缓存一致性”的部分中,有一个示例,其中cpu2可能看不到存储到y,即使在cpu1的内存屏障之后执行内存屏障。我很可能知道这里发生了什么。但固

我试图了解记忆障碍是如何工作的,它们有多有用。我知道,在大多数情况下,它们不值得让我的代码复杂化,但这仍然是一个有趣的话题。试图围绕它建立一个心智模型,但我还没有完全成功

我可能已经成功地理解了release并获得了足够的知识,能够正确地,或者至少更正确地,使用或理解volatile字段。我的问题是使用完整的内存屏障。例如,以下是一些描述的链接:


在名为“缓存一致性”的部分中,有一个示例,其中cpu2可能看不到存储到
y
,即使在cpu1的内存屏障之后执行内存屏障。我很可能知道这里发生了什么。但固定示例包含两个内存屏障,另外一个是在cpu1中的两个存储之后和cpu2中的两个加载之前。我在这里的具体问题是:在两个加载之前和两个存储之后都添加一个屏障,但在两者之间移除这个屏障,这还不够吗?为什么?我可能会有更多相关的问题,因为即使在理论上,这也不容易正确…

这两个处理器是独立的;没有可靠的时间点是“两次加载之前和两次存储之后”——因为这些东西没有任何联系;线程之间可以有任何偏移,并且它们不必等速前进-一个线程可能会在内存访问时被阻塞,或者只是线程中断-而另一个线程则继续此描述假设屏障在cpu上的相应屏障执行存储后执行。我意识到这一点,即不太可能预测到,但简化对于理解事物通常是有用的(如果你记得的话)。例如,您可以假设一个示例执行顺序,在本例中,作者假设第二个cpu中的屏障由于某种原因在第一个cpu中的屏障之后执行。对于这个特定的问题,我坚持同样的假设,我不认为有可能简化记忆障碍语义以使其更容易理解;我也不相信,假设一个执行顺序的例子是完全可能的;我的意思是,这当然给了你一个例子,但这并没有告诉你CPU的每一种行为方式。记忆障碍的意义在于保证所发生的事情,而不是假设和简化。这是一个本质上非常复杂的话题,99%的时候,那些说“我想我明白这一点”的人实际上并不理解。当然也包括我。但因为我不一定意识到这些保证在某些情况下意味着什么,所以我想问一些具体的很难观察到的东西。在这个特定的案例中,我也试图验证我在文章中读到的内容。因为我的理解是,我不需要两个内存屏障,两个存储之后的一个和两个加载之前的一个就足够了,特别是我不关心它们的顺序。相对于彼此,我只想保证我得到两个值,或者没有。比如,两者都没有修改,或者两者都被修改。我的意思是抽象级别与内存顺序有关。为了便于解释,了解处理器实际做什么或可能做什么可能会很有趣,但我不一定要理解这一部分,因为它也是特定于cpu的。虽然如果需要解释一些东西,我可以假设cpu的内存顺序很弱。我相信我听说arm的内存顺序比x86弱;没有可靠的时间点是“两次加载之前和两次存储之后”——因为这些东西没有任何联系;线程之间可以有任何偏移,并且它们不必等速前进-一个线程可能会在内存访问时被阻塞,或者只是线程中断-而另一个线程则继续此描述假设屏障在cpu上的相应屏障执行存储后执行。我意识到这一点,即不太可能预测到,但简化对于理解事物通常是有用的(如果你记得的话)。例如,您可以假设一个示例执行顺序,在本例中,作者假设第二个cpu中的屏障由于某种原因在第一个cpu中的屏障之后执行。对于这个特定的问题,我坚持同样的假设,我不认为有可能简化记忆障碍语义以使其更容易理解;我也不相信,假设一个执行顺序的例子是完全可能的;我的意思是,这当然给了你一个例子,但这并没有告诉你CPU的每一种行为方式。记忆障碍的意义在于保证所发生的事情,而不是假设和简化。这是一个本质上非常复杂的话题,99%的时候,那些说“我想我明白这一点”的人实际上并不理解。当然也包括我。但因为我不一定意识到这些保证在某些情况下意味着什么,所以我想问一些具体的很难观察到的东西。在这个特定的案例中,我也试图验证我在文章中读到的内容。因为我的理解是,我不需要两个内存屏障,两个存储之后的一个和两个加载之前的一个就足够了,特别是我不关心它们的顺序。相对于彼此,我只想保证我得到两个值,或者没有。比如,两者都没有修改,或者两者都被修改。我的意思是抽象级别与内存顺序有关。为了便于解释,了解处理器实际做什么或可能做什么可能会很有趣,但我不一定要理解这一部分,因为它也是特定于cpu的。虽然如果需要解释一些东西,我可以假设cpu的内存顺序很弱。我相信我听说arm的内存顺序比x86弱。