zoukankan      html  css  js  c++  java
  • .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]

  • 相关阅读:
    【HDU4261】Estimation-DP+优先队列优化
    【POJ3744】Scout YYF I-概率DP+矩阵加速优化
    【POJ3744】Scout YYF I-概率DP+矩阵加速优化
    【HDU2294】Pendant-DP矩阵优化
    【HDU2294】Pendant-DP矩阵优化
    【BZOJ1269】文本编辑器editor(AHOI2006)-NOI原题升级版
    【BZOJ1269】文本编辑器editor(AHOI2006)-NOI原题升级版
    【NOI2003T2】文本编辑器Editor-伸展树数列操作
    zk create() 方法
    FLUSH TABLES WITH READ LOCK 锁全局
  • 原文地址:https://www.cnblogs.com/cnblogsfans/p/1597450.html
Copyright © 2011-2022 走看看