假设我需要从多个线程读取/写入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());
}
答案 0 :(得分:2)
如果你有一个List&lt;&gt;在读取或写入之前检查的文件路径,我认为它只需要与运行的线程数一样大。
您只需要确保添加和删除List中的条目的类是多线程安全的,这样两个线程就不能同时添加相同的路径。