C#根据字符串同步线程

C#根据字符串同步线程,c#,multithreading,thread-synchronization,C#,Multithreading,Thread Synchronization,在我的程序中,我需要处理文件。我的程序可以使用几个线程来处理文件,因此我需要某种类型的锁定,因为每个文件一次不应由多个线程处理 private object lockObj = new object(); public void processFile(string file) { lock(lockObj) { //... actuall processing } } 使用上述代码,一次只能处理一个文件,但是两个线程应该能够同时处理两个不同的文件,但不能处理同一个文件

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

private object lockObj = new object();

public void processFile(string file)
{
  lock(lockObj)
  {
    //... actuall processing
  }
}
使用上述代码,一次只能处理一个文件,但是两个线程应该能够同时处理两个不同的文件,但不能处理同一个文件

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

PS:很抱歉没有找到更好的标题

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

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

正如你所说的,你应该考虑使用A字典,因为它可以防止你的字典本身的竞争条件(或其他锁)。通过使用,您可以安全地获得用于锁定的适当对象


尽管如此,这里可能适合采用不同的方法。您可以使用
ConcurrentQueue
BlockingCollection
提供要处理的项目列表,然后让固定数量的线程处理它们。这将从一开始就防止出现同步问题。

我认为您的做法是错误的。您可以简单地将生产者-消费者模式与。一个线程不断读取文件并将其放入队列(使用
Add
),一组工作线程不断从队列中获取文件(使用
Take
)并处理文件。队列的实现方式保证了两个线程无法检索同一个文件,因此不需要显式锁定。

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


这正是您在使用TPL时提出的要求。

+1-虽然通常情况下,使用BlockingCollection时,您会使用
GetConsumingEnumerable()
,而不是
Take
-如果您想将其用作队列,您可以直接使用
ConcurrentQueue
,这很好,但对我不起作用。线程正在做各种各样的工作(不仅仅是文件处理),我不想把文件处理移到只做这些工作的线程上。可能是Good point的重复,但对我不起作用。线程正在做各种工作(不仅仅是文件处理),我不想把文件处理移到只做这些工作的线程上。好吧,我已经认为锁定字符串不是个好主意。谢谢你的确认。ConcurrentDictionary看起来很有用。