ThreadLocal and Task

本文关键字:Task and ThreadLocal | 更新日期: 2023-09-27 17:54:33

我使用静态ThreadLocal来缓存一些重量级对象。考虑下面的代码:

class MatchItemFinder
{
    private static ThreadLocal<PaddedImage> tempImage;
    MatchItemFinder()
    {
        if(tempImage==null) 
            tempImage = new ThreadLocal<PaddedImage>(
            () => new PaddedImage(patchSize, patchSize));
    }
    internal void DoSomething(){
        //Do something with tempImage.Value
    }
}

当DoSomething()是从多个任务并行库线程调用,当每个实例被创建?我的意思是,显然线程被重用,所以我的tempImage是每次创建线程或每次线程被重用时创建的?

从设计的角度来看,你认为这种缓存是一个很好的决定,还是有更好的策略以线程安全的方式缓存大型对象?

我用的是。net 4

ThreadLocal and Task

线程局部变量不与TPL或线程池合作。它们是基于Thread的。当任何TPL库函数重用线程时,您的线程局部变量将被重用。

从设计的角度来看,你认为这种缓存是一个很好的决定,还是有更好的策略以线程安全的方式缓存大型对象?

如果缓存项是不可变的,则不需要线程本地项。使用全局缓存