2014-04-03 41 views
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()); 
    } 
+2

你可能不想要1000,因为你可能会达到其他限制(文件句柄,物理IO,内存等),但你可以尝试并行运行其中的几个。当然,你也需要一个锁来管理你的锁列表:-) .Net框架已经包含一个构造,可以帮助你正在查看的活动类型 - ReaderWriterLock; http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlock.aspx – dash

回答

2

如果你的文件路径列表<>,这是读取或写入前检查,我认为它只是需要那样大的数量线程运行。

您只需确保添加和删除列表中的条目的类是多线程安全的,以便两个线程不能同时添加相同的路径。