HTML5技术

.NET基础拾遗(5)多线程开发基础 - Edison Chou(4)

字号+ 作者:H5之家 来源:博客园 2015-10-01 12:20 我要评论( )

PS:上面代码示例在不同的计算机上运行可能会得到不同的结果,线程池中的可用数码不会再初始时达到最大值,事实上CLR会尝试以一定的时间间隔来逐一地创建新线程,但这个时间间隔非常短。 2.4 如何定义线程独享的全

PS:上面代码示例在不同的计算机上运行可能会得到不同的结果,线程池中的可用数码不会再初始时达到最大值,事实上CLR会尝试以一定的时间间隔来逐一地创建新线程,但这个时间间隔非常短。

2.4 如何定义线程独享的全局数据?

  线程和进程最大的一个区别就在于线程间可以共享数据和资源,而进程则充分地隔离。在很多场合,即使同一进程的多个线程之间拥有相同的内存空间,也需要在逻辑上为某些线程分配独享的数据。例如,在实际开发中往往会针对一些ORM如EF一类的上下文实体做线程内唯一实例的设置,这时就需要用到下面提到的技术。

  (1)线程本地存储(Thread Local Storage,TLS)

  很多时候,程序员可能会希望拥有线程内可见的变量,而不希望其他线程对其进行访问和修改(传统方式中的静态变量是对整个应用程序域可见的),这就需要用到TLS的概念。所谓的线程本地存储(TLS)是指存储在线程环境块内的一个结构,用来存放该线程内独享的数据。进程内的线程不能访问不属于自己的TLS,这就保证了TLS内的数据在线程内是全局共享的,而对于线程外确实不可见的

  (2)定义和使用TLS变量

  在.NET中提供了下列连个方法来存取线程独享的数据,它们都定义在System.Threading.Thread类型中:

  ① object GetData(LocalDataStoreSlot slot)

  ② void SetData(LocalDataStoreSlot slot, object data)

  下面的代码示例则展示了这个机制的使用方法:

class Program { static void Main(string[] args) { Console.WriteLine(); // 创建五个线程来同时运行,但是这里不适合用线程池, (int i = 0; i < 5; i++) { Thread thread = new Thread(ThreadDataSlot.Work); thread.Start(); } Console.ReadKey(); } } 包含线程方法和数据插槽 ThreadDataSlot { // 分配一个数据插槽,注意插槽本身是全局可见的,因为这里的分配是在所有线程 LocalDataStoreSlot localSlot = Thread.AllocateDataSlot(); Work() { // 将线程ID注册到数据插槽中,一个应用程序内线程ID不会重复 Thread.SetData(localSlot, Thread.CurrentThread.ManagedThreadId); // 查看一下刚刚插入的数据 Console.WriteLine(,Thread.CurrentThread.ManagedThreadId.ToString(),Thread.GetData(localSlot).ToString()); // 这里线程休眠1秒 Thread.Sleep(1000); // 查看其他线程的运行是否干扰了当前线程数据插槽内的数据 Console.WriteLine(, Thread.CurrentThread.ManagedThreadId.ToString(), Thread.GetData(localSlot).ToString()); } }

View Code

  该实例的执行结果如下图所示,从下图可以看出多线程的并行运行并没有破坏每个线程插槽内的数据,这就是TLS所提供的功能。

      

PS:LocalDataStoreSlot对象本身并不是线程共享的,初始化一个LocalDataStoreSlot对象意味着在应用程序域内的每个线程上都分配了一个数据插槽。

  (3)ThreadStaticAttribute特性的使用

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Dora.Interception: 一个为.NET Core度身定制的AOP框架 - Artech

    Dora.Interception: 一个为.NET Core度身定制的AOP框架 - Artech

    2017-05-02 11:00

  • 如何在 ASP.NET Core 中发送邮件 - Savorboard

    如何在 ASP.NET Core 中发送邮件 - Savorboard

    2017-05-02 08:02

  • vue全局配置----小白基础篇 - 星光笔

    vue全局配置----小白基础篇 - 星光笔

    2017-04-28 08:04

  • 十二个 ASP.NET Core 例子 - Savorboard

    十二个 ASP.NET Core 例子 - Savorboard

    2017-04-27 16:01

网友点评
i