我正在编写一个系统,用于自动重新计算昂贵方法的结果,然后将它们存储在缓存中。缓存可以是分布式的,这意味着(显然)多个进程可以访问它。
在第一次调用缓存结果的方法时,我想生成一个线程,它会定期重新计算方法的结果并更新缓存。
我希望每个缓存项只生成一个执行线程。在多进程环境中,是否可以使用跨进程互斥体实现这一点?
http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx
这种方法有什么缺陷吗?
编辑:
我的实施真相表:
// in-cache | mutex-found
// 0 0 //not in cache, no mutex; start thread
// 1 0 //in cache, no mutex; assume thread already started (re-calculating thread could be in another process)
// 0 1 //not in cache, mutex found; thread started, do not start thread - log error (and possibly start new thread)
// 1 1 //in cache, mutex found; thread started, do not start thread
答案 0 :(得分:2)
简而言之,我认为这是一个很好的方法。唯一的缺陷是互斥锁识别 - 如果可能的话,通过其句柄告诉辅助线程有关互斥锁的信息。如果必须使用已命名的互斥锁,则可能需要将互斥锁命名为与进程UUID相同以提升唯一性。
答案 1 :(得分:0)
第二个想法,可能有一种更简单的方法来做到这一点。鉴于您对“缓存”的描述是“定期重新计算”,而不是拥有线程,您可以拥有一个中央System.Threading.Timer。由于它只能与单个回调相关联,因此不存在多个线程尝试重写缓存的风险。唯一需要注意的是,此计时器事件需要以原子方式对缓存内存进行单次写入(不会被写入中间的其他线程中断)。