.NET多线程小记(5):线程独享数据TLS

简介:

线程本地存储(Thread Local Storage TLS

在.NET程序中,静态变量是全局(整个应用程序域)可见的数据,一个普通的静态变量对于应用程序域内的所有线程都是可见并且是可访问的。

TLS是指存储在线程环境块内的一个结构,用来存放该线程内独享的数据。进程内的线程不能访问不属于自己的TLS,这就保证了TLS内的数据在线程内是全局共享的,而对于线程外却是不可见的。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  System.Threading;
 
namespace  MultiThreadTest
{
     class  Program
     {
         static  void  Main( string [] args)
         {
             for  ( int  i = 0; i < 5; i++)
             {
                 Thread thread = new  Thread(TestTLS.Task);
                 thread.Start();
             }
             Console.Read();
         }       
     }
 
     class  TestTLS
     {       
         static  LocalDataStoreSlot localSlot = Thread.AllocateDataSlot();
 
         public  static  void  Task()
         {
             Thread.SetData(localSlot, Thread.CurrentThread.ManagedThreadId);
 
             Console.WriteLine( "Thread {0}, Data: {1}" ,Thread.CurrentThread.ManagedThreadId.ToString(),
                 Thread.GetData(localSlot));
 
             Thread.Sleep(1000);
 
             Console.WriteLine( "Thread {0}, Data: {1}" , Thread.CurrentThread.ManagedThreadId.ToString(),
                 Thread.GetData(localSlot));       
         }
     }
}

输出:

clip_image002

还可以使用ThreadStaticAttribute特性实现类似功能。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Text;
using  System.Threading;
 
namespace  MultiThreadTest
{
     class  Program
     {
         static  void  Main( string [] args)
         {
             for  ( int  i = 0; i < 5; i++)
             {
                 Thread thread = new  Thread(ThreadStatic.Task);
                 thread.Start();
             }
             Console.Read();
         }       
     }
 
     class  ThreadStatic
     {
 
         [ThreadStatic]
         static  int  mThreadId = 0;
         static  int  mGId = 0;
 
         public  static  void  Task()
         {
             mThreadId = Thread.CurrentThread.ManagedThreadId;
             mGId = Thread.CurrentThread.ManagedThreadId;
 
             Console.WriteLine( "[Thread : {0}], mThreadId: {1}, mGid: {2}" ,
                 Thread.CurrentThread.ManagedThreadId.ToString(),
                 mThreadId, mGId);
 
             Thread.Sleep(1000);
 
             Console.WriteLine( "[Thread : {0}], mThreadId: {1}, mGid: {2}" ,
                 Thread.CurrentThread.ManagedThreadId.ToString(),
                 mThreadId, mGId);
         }       
     }
}

输出:

clip_image002[4]

本文转自敏捷的水博客园博客,原文链接http://www.cnblogs.com/cnblogsfans/archive/2009/11/06/1597450.html如需转载请自行联系原作者


王德水

相关文章
|
21天前
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
46 1
|
4天前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
24 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
6天前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android应用开发中的多线程编程,涵盖基本概念、常见实现方式及最佳实践。主要内容包括主线程与工作线程的作用、多线程的多种实现方法(如 `Thread`、`HandlerThread`、`Executors` 和 Kotlin 协程),以及如何避免内存泄漏和合理使用线程池。通过有效的多线程管理,可以显著提升应用性能和用户体验。
23 10
|
13天前
|
存储 Ubuntu Linux
C语言 多线程编程(1) 初识线程和条件变量
本文档详细介绍了多线程的概念、相关命令及线程的操作方法。首先解释了线程的定义及其与进程的关系,接着对比了线程与进程的区别。随后介绍了如何在 Linux 系统中使用 `pidstat`、`top` 和 `ps` 命令查看线程信息。文档还探讨了多进程和多线程模式各自的优缺点及适用场景,并详细讲解了如何使用 POSIX 线程库创建、退出、等待和取消线程。此外,还介绍了线程分离的概念和方法,并提供了多个示例代码帮助理解。最后,深入探讨了线程间的通讯机制、互斥锁和条件变量的使用,通过具体示例展示了如何实现生产者与消费者的同步模型。
|
16天前
|
消息中间件 存储 Java
服务重启了,如何保证线程池中的数据不丢失?
【8月更文挑战第30天】为确保服务重启时线程池数据不丢失,可采用数据持久化(如数据库或文件存储)、使用可靠的任务队列(如消息队列或分布式任务队列系统)、状态监测与恢复机制,以及分布式锁等方式。这些方法能有效提高系统稳定性和可靠性,需根据具体需求选择合适方案并进行测试优化。
|
21天前
|
监控 安全 Java
Java多线程调试技巧:如何定位和解决线程安全问题
Java多线程调试技巧:如何定位和解决线程安全问题
68 2
|
22天前
|
存储 Linux 网络安全
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)
|
10天前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
20 7