c# - 重复调用CurrentThread.ManagedThreadId或将值存储在线程本地存储中?

标签 c# multithreading thread-local-storage

有没有人对...的实现有任何见识

SystemThreading.Thread.CurrentThread.ManagedThreadId

像是在做内核往返吗?我特别想知道从多个线程重复调用它是否比一次读取该值,将其存储在线程本地存储中,然后从此以后使用该值更好,例如
ThreadLocal<int> ThreadId = new ThreadLocal<int>(() =>
    Thread.CurrentThread.ManagedThreadId);
...
Tracer.Add("Thread:" + ThreadId.Value);

我今天将要测量这两种变体,但是认为事先听到任何想法(或成见:)会很有趣。

最佳答案

CurrentThread和ManagedThreadId都是内部调用属性,因此值返回由框架本身处理。由于它们是属性,而不是方法,因此可以合理地假定可以快速访问它们,并且不需要存储它们,除非您将它们放入具有多次迭代的循环中。

public extern int ManagedThreadId
{
    [__DynamicallyInvokable, ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), SecuritySafeCritical]
    [MethodImpl(MethodImplOptions.InternalCall)]
    get;
}

如果您关心使用此属性进行日志记录,我们可以看一下流行的日志记录框架(如NLog)如何使用它。原来,它不缓存它,而是直接使用它:
namespace NLog.LayoutRenderers
{
    public class ThreadIdLayoutRenderer : LayoutRenderer
    {
        protected override void Append(StringBuilder builder, LogEventInfo logEvent)
        {
            builder.Append(Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture));
        }
    }
}

关于c# - 重复调用CurrentThread.ManagedThreadId或将值存储在线程本地存储中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16010765/

相关文章:

linux - IPC 的共享内存和线程的共享内存有什么区别?

linux - ARM 上 TLS 的代码序列

c# - 查询表达式无效 cosmosdb

c# - 具有月和年刻度的时间间隔的 TimeSpan 对象的绝对差

c++ - 如何让 Windows 线程同时处理两个函数?

c++ - TBB 线程本地集使用combinable 或enumerable_thread_specific?

c++ - 关于 Windows 中的 TLS 回调

c# - 为什么这个交易范围不起作用?

c# - 无法使用单声道连接到在 ubuntu 上运行的自己的 IPv6 TCP 服务器应用程序

c++ - memory_order_seq_cst 栅栏什么时候有用?