避免多次锁定,同时保护多个资源

时间:2014-04-03 14:21:56

标签: c# multithreading

假设我需要从多个线程读取/写入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());
    }

1 个答案:

答案 0 :(得分:2)

如果你有一个List&lt;&gt;在读取或写入之前检查的文件路径,我认为它只需要与运行的线程数一样大。

您只需要确保添加和删除List中的条目的类是多线程安全的,这样两个线程就不能同时添加相同的路径。