gpt4 book ai didi

c# - ThreadLocal - 什么是线程? (C#)

转载 作者:太空狗 更新时间:2023-10-29 23:20:40 30 4
gpt4 key购买 nike

我正在努力学习 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)都是一个新线程,因此“本地”的每个实例都将初始化为 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 使用线程池,这意味着它从现有线程池中获取一些空闲线程,对其进行处理,然后将其返回(简单来说)。因此,一个或多个后续 Tas.Run 操作完全有可能在同一线程上运行。验证它的最简单方法是打印当前线程 ID:

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

关于c# - ThreadLocal <T> - 什么是线程? (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40462790/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com