【发布时间】:2013-10-03 01:09:20
【问题描述】:
有没有办法同时锁定 2 个不同的对象?
我尝试使用lock(obj1, obj2){...},但出现此错误:
invalid expression term ','
更新:
正如许多用户告诉我尝试只使用一个锁,我感谢他们的建议,因为大多数时候它更可取,我只想展示一个我认为对 2 个对象进行锁更合理的案例。
考虑在不同线程之间共享 2 个队列的情况。您需要避免同时执行Enqueue(item) 和Dequeue()。现在,在代码的特定部分,您希望从一个队列中获取一个元素并将其插入到第二个队列中。我知道可以这样做:
var itme;
lock(_lock1)
{
item = q1.Dequeue();
Monitor.Pulse(_lock1);
}
lock(_lock2)
{
q2.Enqueue(item);
Monitor.Pulse(_lock2);
}
但我认为锁定_lock1 和_lock2 更具可读性和简洁性。
【问题讨论】:
-
为什么要锁定 2 个对象?这可能会导致死锁。
-
我需要将
currentIndex和MessageList锁定在许多线程中。 -
你只需要一把锁。
-
看起来您将尝试锁定一个值类型 (
currentIndex)。这将锁定值的盒装版本(每次锁定时都会生成该框),因此它根本不会执行您期望的操作,允许锁定它的所有代码继续进行。 -
@SAM :
lock关键字需要一个引用类型。我怀疑currentIndex是一个值类型。也许是 int 或 long。实际上,当您尝试锁定值类型时,编译器会抱怨。不要试图将此值强制为对象。听从@DanielAWhite 的建议。
标签: c# multithreading locking