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


    线程本地存储(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));        
            }
        }
    }

    输出:

    clip_image002

    还可以使用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);
            }        
        }
    }

    输出:

    clip_image002[4]

  • 相关阅读:
    Visual Studio 2005 Starter Kits
    怎样去做才是朋友?
    C#读写日志文本文件
    [文摘20080707]马云追加投资20亿 淘宝首定10年超沃尔玛目标
    [转]在WinForm应用程序中实现自动升级
    [转]官方Flash CS3简体中文帮助文档下载,AS3.0简体中文帮助文档下载
    [引]MySQL INNODB类型表的外键关联设置
    [转]winfrom让弹出的MessageBox在指定时间内自动销毁
    生活开心一笑 之 "我家半"与"QQ病毒"
    [English20080721]疯狂英语365句
  • 原文地址:https://www.cnblogs.com/cnblogsfans/p/1597450.html
Copyright © 2020-2023  润新知