C# 多线程中每个任务的独立全局变量:ThreadLocal 使用指南
在 C# 中,可以使用 ThreadLocal<T> 类来创建一个在每个线程中都有自己独立副本的全局变量。这对于在多线程环境中避免变量值相互干扰非常有用。
以下是一个使用 ThreadLocal<T> 的示例代码:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
// 创建一个 ThreadLocal<int> 变量
static ThreadLocal<int> _threadLocal = new ThreadLocal<int>(() =>
{
// 初始化每个线程的变量值
return Thread.CurrentThread.ManagedThreadId;
});
static void Main()
{
// 启动多个任务
Task.Run(() =>
{
// 在任务中访问 _threadLocal 变量
for (int i = 0; i < _threadLocal.Value; i++)
{
Console.WriteLine($'Task 1: {_threadLocal.Value}');
Thread.Sleep(1000);
}
});
Task.Run(() =>
{
// 在任务中访问 _threadLocal 变量
for (int i = 0; i < _threadLocal.Value; i++)
{
Console.WriteLine($'Task 2: {_threadLocal.Value}');
Thread.Sleep(1000);
}
});
Console.ReadLine();
}
}
在这个示例中,我们创建了一个 ThreadLocal<int> 变量,并使用 lambda 表达式初始化每个线程的变量值为当前线程的 ID。然后,我们启动了两个任务,并在每个任务中访问 _threadLocal 变量。
在每个任务中,通过 _threadLocal.Value 属性获取变量的值。由于每个线程都有自己独立的副本,所以每个任务中的 _threadLocal.Value 值都会是不同的。
需要注意的是,ThreadLocal<T> 变量的值只在当前线程中可见,在其他线程中不可见。如果需要在多个线程之间共享数据,可以考虑使用其他线程同步机制,如锁、互斥量等。
ThreadLocal<T> 在以下情况下很有用:
- 当每个线程需要独立的全局变量时
- 当需要避免线程之间对全局变量的访问冲突时
使用 ThreadLocal<T> 可以有效地提高多线程程序的效率和安全性。
原文地址: https://www.cveoy.top/t/topic/bSBe 著作权归作者所有。请勿转载和采集!