【问题标题】:Thread Safe Generic List block Enumeration线程安全通用列表块枚举
【发布时间】:2015-05-17 05:35:35
【问题描述】:

首先我想声明,我可能已经查找了一百个谷歌,以及与我的问题相关的 stackoverflow 问题。我找不到任何可以回答我的具体问题的内容。

我将 DataTable 转换为 List。我有多个线程用 foreach 枚举列表。但是,每 5 分钟一次,主线程需要使用最新数据刷新该列表。发生这种情况时,我需要阻止其他线程读取该线程,直到主线程完全更新了 List。

我发现的所有文章和问题都阻止了一次添加的访问。我知道我可以为更新编写一个阻塞,但我需要该锁也与枚举的所有其他线程同步。我不想在其他线程在他们自己的枚举中间时更新列表。

我怎样才能写一个锁来使用 foreach 语句和我的更新函数?

谢谢

编辑:我想在生产者线程生产时阻止“消费者/观察者”。我不希望消费者/观察者互相阻塞。

【问题讨论】:

  • ReaderWriterLock 非常适合这种情况,在给定时间一个线程写入并且许多线程可以读取,但是在给定时间点只能发生写入或读取
  • 您的问题并不具体:它是经典的 producer/consumers 问题(在您的情况下,它更像是一个 producer/observers,但问题是一样的)。它在网络上有大量记录。我觉得很奇怪,你找不到任何关于它的东西。可以通过semaphorsmonitors 解决。
  • @MrinalKamboj 对于几乎所有使用 .NET 3.5 或更高版本的东西,我建议使用 ReaderWriterLockSlim 而不是 ReaderWriterLock
  • 我需要在生产者生产时阻止消费者/观察者。不过我不希望消费者互相屏蔽。

标签: c# vb.net list


【解决方案1】:

将所有填充和枚举列表的代码放在一个锁块中:

    lock (theList)
    {
       Update(theList);
    }

    lock (theList)
    {
       foreach (var thingy in theList)
       {
         DoStuff(thingy);
       }
    }

【讨论】:

  • 现在你已经阻止了所有阅读线程的连贯工作,即使它们不会相互造成任何困难。
  • 很糟糕的设计,它会同步所有线程的访问,这种情况下甚至无法读取多个线程
  • 我的印象是 OP 正在寻找非常基本的线程同步。技巧。也许我看错了。解释如何实现多读/单写锁原语似乎远远超出了范围。
  • 框架已经提供了两个,为什么还要实现一个?
【解决方案2】:

起初我虽然你可以尝试使用BlockingCollection。它实现了生产者/消费者问题。

您实际上需要的是一种为您的阅读线程和您的主线程设置会合的方法。

我认为这可以通过监视器来完成(尤其是通过使用WaitPulse 方法)。试试看,告诉我们你发现了什么。

【讨论】:

  • 谢谢 Kryptos,我会告诉你的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2014-09-09
  • 2012-10-17
相关资源
最近更新 更多