内存屏障(Memory Barrier)

作者:追风剑情 发布于:2015-4-16 17:23 分类:C#

内存屏障

● 编译器,CLR或者CPU可能会更改指令的顺序来提高性能
● 编译器,CLR或者CPU可能会通过缓存来优化变量,这种情况下对其他线程是不可见的。

示例:多核CPU中的单例模式需要用内存墙来保证线程安全。

  1. public sealed class Singleton {
  2.  
  3. private static Singleton instance;
  4. static readonly object padlock = new object();
  5.  
  6. public static Singleton Instance {
  7. get {
  8. if ( instance == null ) {
  9. lock ( padlock ) {
  10. if ( instance == null ) {
  11. Singleton newVal = new Singleton();
  12. System.Threading.Thread.MemoryBarrier();
  13. instance = newVal;
  14. }
  15. }
  16. }
  17.  
  18. return instance;
  19. }
  20. }
  21. }


示例:CPU缓存变量


  1. using System;
  2. using System.Threading;
  3.  
  4. namespace ConsoleApp14
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. //在 Release 模式下,选择 [开始执行(不调试)],while将陷入死循环。
  11. //这是因为complete值被缓存到了CPU寄存器中,所以complete一直为false。
  12. bool complete = false;
  13. var t = new Thread(() =>
  14. {
  15. bool toggle = false;
  16. while (!complete)
  17. {
  18. //重点:加句内存屏障,方可及时读取complete的最新值
  19. Thread.MemoryBarrier();//不加这句会陷入死循环
  20. toggle = !toggle;
  21. }
  22. });
  23. t.Start();
  24. Thread.Sleep(1000);
  25. //release模式下,改变了值,但t线程无法及时感知
  26. complete = true;
  27. t.Join(); // 等待t线程返回
  28.  
  29. Console.ReadLine();
  30. }
  31. }
  32. }


标签: C#

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号