最佳替换每个资源的同步访问的命名互斥锁

时间:2011-04-20 23:10:06

标签: c# mutex named

for (int i = 0; i < 100; i++)
{
        // If current thread needs resource(i) then

        Mutex mutex = new Mutex(false, "Mutex" + i.ToString());
        mutex.WaitOne();

        // synchronized access to resource(i)

        mutex.ReleaseMutex();
}

我们有100个资源,每个资源应该由一个线程同时访问(可以同时访问资源[2]和资源[5])所以我使用了上面的代码。在这种情况下,命名互斥锁的最佳替代方法是什么?

2 个答案:

答案 0 :(得分:2)

如果这只是一个进程,那么就根本不需要命名的互斥锁。只需创建N个对象的列表或数组,然后使用lock

const int NumLocks = 100;
List<object> LockObjects = new List<object>(NumLocks);

// to initialize
for (int i = 0; i < NumLocks; ++i)
{
    LockObjects.Add(new object());
}

// and your loop
for (int i = 0; i < NumLocks; ++i)
{
    // if current thread needs lock[i] then
    lock(LockObjects[i])
    {
        // do whatever you need to do
        // and then release the lock
    }
}

或者,您可以锁定各个资源对象。如果他们真的是对象。我发现使用单独的锁对象更容易理解和维护,因为“资源”可能是一个方法或一组对象。锁定对象是一种抽象,对我而言,有助于理解。

如果多个进程需要这个,那么除了使用Mutex之外,我没有看到一个好的解决方案。但是,我建议在程序开始时创建一个Mutex个对象的列表并保持它们。这样,在循环中你所要做的就是WaitOne - 每次循环都不需要创建对象。

答案 1 :(得分:1)

假设资源是引用类的实例,只需锁定每个资源。

var r = resource(i);
lock (r)
{
    // synchronized access to resource(i)
}