进程间锁定

时间:2010-09-17 18:02:01

标签: .net multithreading locking mutex

我正在编写一个系统,用于自动重新计算昂贵方法的结果,然后将它们存储在缓存中。缓存可以是分布式的,这意味着(显然)多个进程可以访问它。

在第一次调用缓存结果的方法时,我想生成一个线程,它会定期重新计算方法的结果并更新缓存。

我希望每个缓存项只生成一个执行线程。在多进程环境中,是否可以使用跨进程互斥体实现这一点?

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

2 个答案:

答案 0 :(得分:2)

简而言之,我认为这是一个很好的方法。唯一的缺陷是互斥锁识别 - 如果可能的话,通过其句柄告诉辅助线程有关互斥锁的信息。如果必须使用已命名的互斥锁,则可能需要将互斥锁命名为与进程UUID相同以提升唯一性。

答案 1 :(得分:0)

第二个想法,可能有一种更简单的方法来做到这一点。鉴于您对“缓存”的描述是“定期重新计算”,而不是拥有线程,您可以拥有一个中央System.Threading.Timer。由于它只能与单个回调相关联,因此不存在多个线程尝试重写缓存的风险。唯一需要注意的是,此计时器事件需要以原子方式对缓存内存进行单次写入(不会被写入中间的其他线程中断)。