65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 ThreadStaticAttribute

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.67/5 (2投票s)

2013 年 10 月 11 日

CPOL

1分钟阅读

viewsIcon

12855

这是一个属性,它指示变量在每个线程中都有一个实例。这是静态变量的一种变体。静态变量

这是一个属性,它指示变量在每个线程中都有一个实例。这是静态变量的一种变体。静态变量在程序的整个生命周期中只有一个实例。用 [ThreadStatic] 标记的变量在程序中每个线程都有一个实例。

语法如下所示(C#):
[ThreadStatic]
static int someValue;

为了更好地理解这个特性,让我们考虑以下程序:

using System;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        public static int accessed = 0;

        [ThreadStatic]
        public static int accessedInaThread = 0; //我们希望这个变量在每个线程中都是静态的

        static void Main(string[] args)
        {
            Program prog = new Program();
            
            //定义线程
            Thread thread1 = new Thread(new ThreadStart(prog.ThreadFunc1));
            Thread thread2 = new Thread(new ThreadStart(prog.ThreadFunc2));

            //启动 thread1
            thread1.Start();
            //等待 thread1 完成
            thread1.Join();
            
            //启动 thread2
            thread2.Start();
            //等待 thread2 完成
            thread2.Join();
        }

        public void ThreadFunc1()
        {
            accessed++;
            accessedInaThread++;
            Console.WriteLine("Thread1 中 accessed 的值: " + accessed.ToString());
            Console.WriteLine("Thread1 中 accessedInaThread 的值: " + accessedInaThread.ToString());
        }

        public void ThreadFunc2()
        {
            accessed++;
            accessedInaThread++;
            Console.WriteLine("Thread2 中 accessed 的值: " + accessed.ToString());
            Console.WriteLine("Thread2 中 accessedInaThread 的值: " + accessedInaThread.ToString());
        }
    }    
}

这里 accessed 是一个静态变量,而 accessedInaThread 是一个 ThreadStatic 变量。这些变量在两个不同的线程中被访问和修改。请注意程序的输出:

Thread1 中 accessed 的值: 1
Thread1 中 accessedInaThread 的值: 1
Thread2 中 accessed 的值: 2
Thread2 中 accessedInaThread 的值: 1

这里 threadstatic 变量为每个线程都有不同的副本。因此,thread1 中值的变化不会影响 thread2 中的值。

© . All rights reserved.