0
假设我需要从多个线程读取/写入1000个文件(即一个文件可以从多个线程写入)。我不希望有一个锁来保护所有文件,因为这会很慢。我所能想到的是有一个List<object>
可以容纳1000个锁,并执行诸如lock(list[i]) { write to i'th file}
之类的操作。这是正确的方式吗?避免多重锁定,同时保护多个资源
这将是做法:
static object _list_lock = new object();
static List<object> locks = new List<object>();
public static void Main(string[] args)
{
for(int i=0; i<1000; i++)
locks.Add(new object());
var tasks = new List<Task>();
for(int i=0; i<15000; i++)
{
var t = Task.Run(() =>
{
int file = (new Random()).Next(0, 1000);
object l;
lock(_list_lock)
{
l = locks[file];
}
lock(l)
{
//write to file 'file'
}
});
tasks.Add(t);
}
tasks.ForEach(f => f.Wait());
}
你可能不想要1000,因为你可能会达到其他限制(文件句柄,物理IO,内存等),但你可以尝试并行运行其中的几个。当然,你也需要一个锁来管理你的锁列表:-) .Net框架已经包含一个构造,可以帮助你正在查看的活动类型 - ReaderWriterLock; http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlock.aspx – dash