【问题标题】:What is problem on this lock?这个锁有什么问题?
【发布时间】:2010-08-11 20:38:48
【问题描述】:

这个锁有问题,但我不明白那是什么。我强烈怀疑下面的示例没有很好地锁定。那么可能是什么问题呢?

class example
{
    object locker = new object();
    void start()
    {
        for (int i = 0; i < 1000; i++)
        {
            (new Thread(dostuff)).Start();
        }
    }
    void dostuff()
    {
        lock (locker)
        {
            //dosomething
        }
    }
}

【问题讨论】:

  • 您需要多解释一下您正在尝试做什么以及为什么这没有达到您的预期。一方面 - 您是否希望所有 1000 个线程都作用于同一个对象(这对于 1000 个线程来说可能没有意义),还是它们应该作用于可能不同的对象?
  • 线程在同一个对象上工作
  • 为什么问题投票结束?

标签: c# .net multithreading locking


【解决方案1】:

看起来您正在启动 1000 个线程,然后锁定每个线程。这意味着 dostuff 中的代码(位于 lock 部分)将按顺序执行,而不是同时执行。

正如所写,直接在 for 循环中调用 dostuff() 会更有效。

【讨论】:

  • 这只是一个例子来展示我的特殊问题。它已经是预期的锁定,但我的应用程序显示锁定不起作用,所以我得到了意想不到的结果。
  • 那么您的应用程序向您显示了哪些表明锁不起作用的信息?
  • 我不想告诉我代码的特殊方面,但我不明白是什么导致我的应用程序出现意外结果。示例类只有一个实例,所以编写的代码没有问题吧?
  • @Freshblood:什么意外的结果?是减速还是崩溃?
  • @Henk Holterman - 不会变慢或崩溃,但会得到奇怪的结果。得到结果让我觉得锁定有问题。但正如你所说,锁定没有任何问题,所以我会再看看其他可能导致问题的原因。
【解决方案2】:

您的代码创建了 1000 个线程。这是非常昂贵的,需要超过 1 GB 的内存。

然后所有这些线程竞争一个锁,本质上是序列化(去线程化)整个操作。

但是您的 lock 工作正常,没有任何问题。只是当您运行此应用程序时,您的 PC 可能会崩溃。


另请注意,您要保护的对象应与储物柜对象一对一地绑定。

但为了获得更好的答案,您必须发布更完整且可能更接近真实情况的代码。

【讨论】:

  • 这没有意义,仍然检查导致奇怪结果的原因
  • 我不知道你在哪里收集这个需要超过 1 GB 的内存。它只有 1,000 个线程,所以你假设他每个线程至少获取 1.02 MB?
  • @Gary:这是默认堆栈大小。
  • 问题不在于内存大小。
【解决方案3】:

我不太确定您在这里做什么,但是您的 1000 个线程将连续运行。首先破坏了线程的目的。

您的“dostuff”方法立即锁定线程运行的整个长度。然后线程解锁,下一个线程可以开始处理(并锁定......)

【讨论】:

    【解决方案4】:

    我不确定您的问题是什么——这段代码将启动 dostuff 1000 次,但锁内的代码一次只能执行一次。

    您可能遇到的唯一问题是,无论您创建的示例类的副本数量如何,您一次只需要执行一个代码。如果这很重要,那么您需要将储物柜对象设为静态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 2021-08-20
      • 2015-09-23
      • 2021-02-27
      • 2012-03-10
      • 2010-11-01
      • 2011-08-26
      相关资源
      最近更新 更多