C#根据字符串同步线程

时间:2012-08-24 19:27:47

标签: c# multithreading thread-synchronization

在我的程序中,我需要处理文件。我的程序可以使用多个线程来处理文件,因此我需要某种锁定,因为每个文件不应该被多个线程一次处理。

private object lockObj = new object();

public void processFile(string file)
{
  lock(lockObj)
  {
    //... actuall processing
  }
}

使用上面的代码,一次只能处理一个文件,但是两个线程应该能够一次处理两个不同的文件,但不能处理相同的文件。

我的第一个想法是创建一个字典,其中键是文件,而值是锁对象。 但我想知道是否也可以锁定字符串文件?有什么想法吗?

PS:很抱歉找不到更好的头衔

3 个答案:

答案 0 :(得分:4)

  

我的第一个想法是创建一个字典,其中键是文件,而值是锁对象。但我想知道是否也可以锁定字符串文件?有什么想法吗?

如果在运行时创建字符串,则锁定字符串将不安全。最好制作一个对象字典,然后用它来锁定。

话虽这么说,你应该考虑在这本词典中使用ConcurrentDictionary<string,object>,因为它可以防止词典中的竞争条件(或其他锁定)。通过使用GetOrAdd,您可以安全地获取用于锁定的适当对象。

话虽如此,但这里可能采用不同的方法。您可以使用ConcurrentQueueBlockingCollection来提供要处理的项目列表,然后使用固定数量的线程处理它们。这样可以防止首先出现同步问题。

答案 1 :(得分:2)

我认为你正以错误的方式接近这一点。您只需使用BlockingCollection的生产者 - 消费者模式即可。一个线程不断读取文件并将它们放入队列(使用Add),并且一堆工作线程继续从队列中取出(使用Take)并处理文件。实现队列的方式保证两个线程无法检索同一个文件,因此不需要显式锁定。

答案 2 :(得分:0)

如果您正在使用c#中的线程,那么您应该检查任务并行库(TPL)。这是一个学习曲线,但是一旦掌握了它,您的多线程代码将更简单,更易于维护。

Here's an example完全符合您使用TPL的要求。