0
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 个资源,每个资源都应该由单个线程同时访问(可以同时访问 resource[2] 和 resource[5]),所以我使用了上面的代码。在这种情况下,命名互斥锁的最佳选择是什么?

4

2 回答 2

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——不需要每次都在循环中创建对象。

于 2011-04-20T23:29:06.993 回答
1

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

var r = resource(i);
lock (r)
{
    // synchronized access to resource(i)
}
于 2011-04-20T23:16:51.447 回答