最好替换命名的互斥锁以实现每个资源的同步访问

|
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]),所以我使用了上面的代码。在这种情况下,什么是命名互斥的最佳选择?     
已邀请:
如果这一切都在一个过程中,那么根本就不需要命名互斥体。只需创建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
    }
}
或者,您可以锁定单个资源对象。如果它们确实是对象。我发现使用单独的锁对象更容易理解和维护,因为\“ resource \”可能是方法或一组对象。锁对象是对我来说有助于理解的抽象。 如果有多个进程需要这样做,那么除了使用ѭ3之外,我看不到任何好的解决方案。但是,我建议在程序开始时创建这些
Mutex
对象的列表,并将其保留。这样,在循环中只需要做
WaitOne
,就不需要每次循环都创建对象。     
假设资源是引用类的实例,只需锁定每个资源即可。
var r = resource(i);
lock (r)
{
    // synchronized access to resource(i)
}
    

要回复问题请先登录注册