.NET多线程小记(5):线程独享数据TLS
2009-11-06 15:13 敏捷的水 阅读(809) 评论(0) 编辑 收藏 举报线程本地存储(Thread Local Storage TLS)
在.NET程序中,静态变量是全局(整个应用程序域)可见的数据,一个普通的静态变量对于应用程序域内的所有线程都是可见并且是可访问的。
TLS是指存储在线程环境块内的一个结构,用来存放该线程内独享的数据。进程内的线程不能访问不属于自己的TLS,这就保证了TLS内的数据在线程内是全局共享的,而对于线程外却是不可见的。
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)); } } }
输出:
还可以使用ThreadStaticAttribute特性实现类似功能。
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); } } }
输出:
扫码关注公众号,了解更多管理,见识,育儿等内容
作者: 王德水
出处:http://www.cnblogs.com/cnblogsfans
版权:本文版权归作者所有,转载需经作者同意。
出处:http://www.cnblogs.com/cnblogsfans
版权:本文版权归作者所有,转载需经作者同意。