这个锁有什么问题?

时间:2010-08-11 20:38:49

标签: c# .net multithreading locking

在这个锁中存在一个问题,但我无法理解这是什么。我强烈怀疑下面的例子没有足够的锁定。那有什么问题呢?

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

然后所有这些线程争夺单个锁,基本上是序列化(解线程)整个操作。

但你的工作正常,没有错。只是当你运行这个应用程序时,它可能看起来像你的PC崩溃了。


另请注意,您要保护的对象应与锁定器对象1对1绑定。

但是为了获得更好的答案,你必须发布一些更完整的代码,可能更接近真实的代码。

答案 2 :(得分:2)

我不太确定你在这里做什么,但你的1000个线程将连续运行。首先击败线程的目的。

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

答案 3 :(得分:2)

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

锁定的唯一问题是,如果您需要一次只执行一个代码,而不管您创建的示例类的副本数量是多少。如果这很重要,那么您需要使锁定器对象保持静态。