ThreadLocal & lt; T>-什么是线?(c#)
本文关键字:什么 lt ThreadLocal | 更新日期: 2023-09-27 18:16:49
我正在努力学习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)将是一个新线程,因此每个"local"实例将初始化为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();
}
}
}
原因是Task.Run
使用线程池,这意味着它从已经存在的线程池中获取一些空闲线程,对其进行处理,并且将其返回(简单来说)。所以很有可能一个或多个后续的ta。运行操作将在同一线程上运行。最简单的验证方法是打印当前线程id:
Task.Run(() => {
local.Value++;
Console.WriteLine("Thread id: {0}, value: {1}", Thread.CurrentThread.ManagedThreadId, local.Value);
}