程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了内存屏障生成器大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决内存屏障生成器?

开发过程中遇到内存屏障生成器的问题如何解决?下面主要结合日常开发的经验,给出你关于内存屏障生成器的解决方法建议,希望对你解决内存屏障生成器有所启发或帮助;

这是我对这个问题的看法,并试图在一个答案中提供一个准完整清单。如果遇到其他问题,我将不时编辑我的答案。

普遍认为会引起隐性障碍的机制:

  • 所有@H_913_8@monitor类方法,包括C#关键字lock
  • 所有Interlocked类方法。
  • 所有Volatile类方法(.NET 4.5+)。
  • 大多数SpinLock方法包括EnterExit
  • Thread.Join
  • Thread.VolatileReadThread.VolatileWrite
  • Thread.MemorybarrIEr
  • volatile关键字。
  • 启动一个线程或导致一个代表到另一个线程上执行包括任何QueueUserWorkItemTask.Factory.StartNewThread.Start,编译器提供的BeginInvoke方法等
  • 使用信令机制,诸如@H_913_8@manualresetEvent,autoresetEventCountdowneventSemaphorebarrIEr,等。
  • 使用编组操作,如Control.Invokedispatcher.InvokeSynchronizationContext.Post,等。

推测(但不确定)导致隐式障碍的机制:

  • Thread.Sleep (由我本人提出,也可能是其他人提出的,因为使用这种方法可以解决存在内存障碍问题的代码)
  • Thread.YIEld
  • Thread.SpinWait
  • Lazy<T>取决于LazyThreadSafetymode指定

其他值得注意的提及:

  • C#中事件的默认添加和删除处理程序,因为它们使用lockInterlocked.CompareExchange
  • x86商店具有发布围栏语义
  • 尽管ECMA规范没有强制性规定,但Microsoft对Cli的实现已在写入时释放了篱笆语义。
  • @H_913_8@marshalByRefObject似乎抑制了子类中的某些优化,这可能使其看起来好像存在隐式内存屏障。感谢Hans Passant发现此问题并将其引起我的注意。1个

1这说明了为什么BACkgrounDWorker不用属性volatile的基础字段即可正确工作的原因CancellationPending

解决方法

阅读Joseph
Albahari的线程教程,以下内容是内存障碍的产生者:

  • C#的lock声明(@H_913_8@monitor.Enter/ @H_913_8@monitor.Exit)
  • Interlocked类上的所有方法
  • 使用线程池的异步回调-其中包括异步委托,APM回调和任务延续
  • 设置并等待信令构造
  • 任何依赖信令的内容,例如启动或等待任务

此外,Hans Passant和Brian Gideon
添加了以下内容(假设其中一个都不属于先前的类别之一):

  • 启动或唤醒线程
  • 上下文切换
  • Thread.Sleep()

我想知道这份清单是否完整(如果可以实际制作出完整的清单)

编辑 建议:

  • 易失性(阅读意味着获得范围,写作意味着释放范围)

大佬总结

以上是大佬教程为你收集整理的内存屏障生成器全部内容,希望文章能够帮你解决内存屏障生成器所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。