フレームワークでロック メカニズムを実行するクラスを実装する必要があります。いくつかのスレッドがあり、それらには 0、1、2、3 の番号が付けられていResourceHandler
ます。指定されたオブジェクトでこれらのスレッドをロックする という静的クラスがあります。要件は、nLock()
回の呼び出しが m 回のRelease()
呼び出しによって実現される必要があることです。ここで、n = [0..] および m = [0..] です。そのため、1 つのオブジェクトに対して何回ロックを実行したとしても、Release()
すべてのロックを解除するには 1 回の呼び出しで十分です。さらに、オブジェクトがロックされていない場合、Release()
call は何も実行しません。また、どのオブジェクトがどのスレッドでロックされているかを知る必要があります。
私はこの実装を持っています:
public class ResourceHandler
{
private readonly Dictionary<int, List<object>> _locks = new Dictionary<int, List<object>>();
public static ResourceHandler Instance {/* Singleton */}
public virtual void Lock(int threadNumber, object obj)
{
Monitor.Enter(obj);
if (!_locks.ContainsKey(threadNumber)) {_locks.Add(new List<object>());}
_locks[threadNumber].Add(obj);
}
public virtual void Release(int threadNumber, object obj)
{
// Check whether we have threadN in _lock and skip if not
var count = _locks[threadNumber].Count(x => x == obj);
_locks[threadNumber].RemoveAll(x => x == obj);
for (int i=0; i<count; i++)
{
Monitor.Exit(obj);
}
}
// .....
}
実際、ここで私が心配しているのはスレッドセーフです。スレッドセーフかどうかは実際にはわかりません。それを修正するのは本当に苦痛です。タスクを正しく実行していますか?また、これがスレッドセーフであることを確認するにはどうすればよいですか?