【发布时间】:2011-09-28 17:43:53
【问题描述】:
阅读Joseph Albahari's threading tutorial,以下是内存屏障的生成器:
- C# 的
lock语句(Monitor.Enter/Monitor.Exit) -
Interlocked类的所有方法 - 使用线程池的异步回调——包括异步委托、APM 回调和任务延续
- 设置和等待信号结构
- 任何依赖于信号的事情,例如启动或等待任务
此外,Hans Passant 和 Brian Gideon added the following(假设其中没有一个已经属于前面的类别之一):
- 启动或唤醒线程
- 上下文切换
Thread.Sleep()
我想知道这个列表是否完整(如果甚至可以实际制作完整的列表)
编辑建议添加:
- 易失性(读取意味着获取栅栏,写入意味着释放栅栏)
【问题讨论】:
-
这将是关于Memory Models。在 x86/x64 上,每个 Write 都是一个栅栏。阅读 Albahari 文章中关于安腾的部分。此列表不会有太多实际用途。
-
谢谢,我知道那篇文章。实际上,根据它,在 .NET 2 中,所有写入都是写入栅栏(无论硬件架构如何)。我对其他 .NET 隐含的内存障碍感兴趣。
-
@ohadsc:类似于 x86 的“所有写入都是写入栅栏”行为是 Microsoft CLR 的一个特性。 ECMA CLI 规范不提供任何此类保证,我不确定其他实现提供了哪些强有力的保证;例如,单声道。
-
@LukeH - 是的,我应该更具体一些
标签: c# memory-barriers