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])所以我使用了上面的代码。在这种情况下,命名互斥锁的最佳替代方法是什么?
答案 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)
}