C# 中的线程本地与局部变量

本文关键字:局部变量 线程 | 更新日期: 2023-09-27 18:19:09

下面的代码中这个线程名称和本地名称有什么区别?它们都是 ThreadLocal 吗?

// Thread-Local variable that yields a name for a thread
ThreadLocal<string> ThreadName = new ThreadLocal<string>(() =>
{
    return "Thread" + Thread.CurrentThread.ManagedThreadId;
});
// Action that prints out ThreadName for the current thread
Action action = () =>
{
    // If ThreadName.IsValueCreated is true, it means that we are not the 
    // first action to run on this thread. 
    bool repeat = ThreadName.IsValueCreated;
    String LocalName = "Thread" + Thread.CurrentThread.ManagedThreadId;
    System.Diagnostics.Debug.WriteLine("ThreadName = {0} {1} {2}", ThreadName.Value, repeat ? "(repeat)" : "", LocalName);
};
// Launch eight of them.  On 4 cores or less, you should see some repeat ThreadNames
Parallel.Invoke(action, action, action, action, action, action, action, action);
// Dispose when you are done
ThreadName.Dispose();

C# 中的线程本地与局部变量

LocalName不是线程本地的。它的范围限定为周围 lambda 的执行。每次运行 lambda 时,您都会获得一个新值(并且并发运行是独立的(。使用ThreadLocal,您可以获得每个线程的新值。如果ThreadName.Value碰巧在同一线程上,则重复调用 只会给你一个值。

在此示例中,两者都是等效的,因为Thread.ManagedThreadId也是线程本地的。试试Guid.NewGuid() .

有一个线程池。因此,如果一个线程被重用于第二个操作,你将得到"重复"。本地名称是一个局部变量。