【问题标题】:How to solve two threads manipulating two collections?如何解决两个线程操作两个集合?
【发布时间】:2012-05-14 09:57:24
【问题描述】:

我有两个类,每个类都有一个private static List<int> list,以及每个类中用于操作列表的方法,它们采用以下形式:

public static void Add(int number)
{
  lock (list)
  {
    Monitor.Pulse(list);

    containers.Add(list);

    Monitor.Wait(list);
  }
}

问题是,如果我有两个线程,Thread1 在 Class1 的 Add() 方法中,Thread2 在 Class2 的 Add() 方法中,那么它们每个都会到达 Wait() 方法。但是因为它们处于不同的等待队列中,所以 Pulse() 方法将不起作用(至少,这是我怀疑的)。我该如何解决这个难题?

【问题讨论】:

  • 您能描述一下您要做什么吗?看来您可能过于复杂了。
  • 而且您发布的代码似乎不正确。 containers 是什么?并且参数container没有在任何地方使用。
  • 为什么需要Monitor.PulseMonitor.Wait?为什么lock 不够用?
  • 你可以寻找 System.Collections.Concurrent.BlockingCollection
  • 我编辑了代码,这样就没有更多的容器了。我想使用列表而不是阻塞集合,因为它没有。我使用 monitor.Pulse() 和 monitor.Wait() 以便同步。使用 Pulse() 和 Wait() 输出将是 Thread1 Thread2 Thread1 Thread2 等。我想做的是从一个集合中取出,然后将其放入具有两个线程的另一个集合中。

标签: c# multithreading c#-4.0


【解决方案1】:

如果它们都共享对同一个底层列表的相同引用,那很好。如果您尝试使用 lock 关键字,则不需要使用 Monitor.wait 和 Monitor.pulseall,因为编译器会在看到 lock (...) { } 时自动执行此操作。

【讨论】:

    【解决方案2】:

    如果您使用的是 .NET 4,您可能希望使用并发集合。

    More info on MSDN

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2013-02-22
      • 2021-04-17
      • 1970-01-01
      • 2015-08-11
      • 2020-07-22
      相关资源
      最近更新 更多