.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如需转载请自行联系原作者


王德水

相关文章
|
10天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
21天前
|
存储 缓存 NoSQL
Redis单线程已经很快了6.0引入多线程
Redis单线程已经很快了6.0引入多线程
31 3
|
23天前
|
消息中间件 安全 Linux
线程同步与IPC:单进程多线程环境下的选择与权衡
线程同步与IPC:单进程多线程环境下的选择与权衡
57 0
|
28天前
|
存储 前端开发 Java
【C++ 多线程 】C++并发编程:精细控制数据打印顺序的策略
【C++ 多线程 】C++并发编程:精细控制数据打印顺序的策略
43 1
|
30天前
mvc.net分页查询案例——DLL数据访问层(HouseDLL.cs)
mvc.net分页查询案例——DLL数据访问层(HouseDLL.cs)
8 0
|
1月前
|
数据采集 存储 Java
「多线程大杀器」Python并发编程利器:ThreadPoolExecutor,让你一次性轻松开启多个线程,秒杀大量任务!
「多线程大杀器」Python并发编程利器:ThreadPoolExecutor,让你一次性轻松开启多个线程,秒杀大量任务!
|
17天前
|
安全 Java 容器
Java并发编程:实现高效、线程安全的多线程应用
综上所述,Java并发编程需要注意线程安全、可见性、性能等方面的问题。合理使用线程池、同步机制、并发容器等工具,可以实现高效且线程安全的多线程应用。
14 1
|
28天前
|
消息中间件 Java 数据库连接
【C++ 多线程】C++ 多线程环境下的资源管理:深入理解与应用
【C++ 多线程】C++ 多线程环境下的资源管理:深入理解与应用
37 1
|
29天前
|
Java API C++
【C++ 与Qt 线程】C++ std::thread 与Qt qthread多线程混合编程
【C++ 与Qt 线程】C++ std::thread 与Qt qthread多线程混合编程
40 1
|
29天前
|
SQL 数据库
使用ADO.NET查询和操作数据
使用ADO.NET查询和操作数据
9 0