ThreadLocal <t> - 什么是线程? (C#)

时间:2016-11-07 10:21:10

标签: c# multithreading

我在C#中挣扎多线程(我只是为了好玩而学习),并意识到我可能不明白线程是什么!当我运行下面的代码时,我希望得到类似下面的输出。

T1: 11
T2: 11
T3: 11
T4: 11
T5: 11
T6: 11

(可能以不同的顺序)

但是,我得到了像

这样的东西
T1: 11
T2: 11
T3: 12
T5: 12
T6: 13
T4: 11

我假设每个任务(T1到T6)都是一个新线程,因此每个任务都是&#34; local&#34;将初始化为10并递增1。但它肯定不会发生这种情况。如果有人能够解释发生的事情和我错误的假设,我将非常感激。 (我必须承认,我发现很难掌握线程,因为我找不到足够基本的东西来开始!)

using System;
using System.Threading;
using System.Threading.Tasks;

namespace TestThreads
{

    class TestThreadLocal
    {

        static void Main()
        {
            ThreadLocal<int> local = new ThreadLocal<int>(() =>
            {   return 10;
            });

            Task t1 = Task.Run(() =>
            {   local.Value++;
                Console.WriteLine("T1: " + local.Value);
            });

            Task t2 = Task.Run(() =>
            {   local.Value++;
                Console.WriteLine("T2: " + local.Value);
            });
            Task t3 = Task.Run(() =>
            {   local.Value++;
                Console.WriteLine("T3: " + local.Value);
            });

            Task t4 = Task.Run(() =>
            {   local.Value++;
                Console.WriteLine("T4: " + local.Value);
            });

            Task t5 = Task.Run(() =>
            {   local.Value++;
                Console.WriteLine("T5: " + local.Value);
            });

            Task t6 = Task.Run(() =>
            {   local.Value++;
                Console.WriteLine("T6: " + local.Value);
            });

            Task.WaitAll(t1, t2, t3, t4, t5, t6);
            local.Dispose();
        }
    }
}

1 个答案:

答案 0 :(得分:4)

原因是Task.Run使用线程池,这意味着它从已经存在的线程池中抓取一些空闲线程,对它进行处理,然后将其返回(简单来说) )。因此,一个或多个后续Tas.Run操作完全可能在同一个线程上运行。最简单的验证方法是打印当前的线程ID:

Task.Run(() => {
   local.Value++;
   Console.WriteLine("Thread id: {0}, value: {1}", Thread.CurrentThread.ManagedThreadId, local.Value);
}
相关问题