我想同时锁定两个对象.为什么我不能像这样的代码写?
锁(obj1,obj2)
我应该这样写吗?
lock (obj1)
{
lock (obj2)
{
}
}
Run Code Online (Sandbox Code Playgroud)
这可能会变得更简单吗?可能最好引入特殊的私有对象并将其用于锁...
Her*_*nis 40
好吧,这个问题太旧了,但是,这是一个我认为是紧凑的问题,两个代码都将结束相同的编译语句(这和问题描述中的一个):
lock (obj1) lock (obj2)
{
// your code
}
Run Code Online (Sandbox Code Playgroud)
Håv*_*d S 31
这是锁定多个对象的正确方法,是的.
我的猜测是,只允许锁定语句的单个参数的原因是使锁定的顺序尽可能清楚.
请注意,您必须确保在代码中的每个位置都以相同的顺序获取两个锁,否则您可能会出现死锁.
您也可以按照建议引入一个专用的锁定对象,但这会使您的锁定更加粗糙.这一切都取决于您的需求.如果您有时只需要其中一个锁,则应将它们分开(但请确保保留锁定顺序,如上所述).
我遇到了同样的问题,并编写了可能会帮助你的片段,即使它远非完美:
private void MultiLock(object[] locks, WaitCallback pFunc, int index = 0)
{
if (index < locks.Count())
{
lock (locks[index])
{
MultiLock(locks, pFunc, index + 1);
}
}
else
{
ThreadPool.QueueUserWorkItem(pFunc);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,只需调用此方法:
public object LockedObject1 = new Object();
public object LockedObject2 = new Object();
public void MyFunction(object arg)
{
WaitCallback pFunc = delegate
{
// Operations on locked objects
}
MultiLock(new object[] {LockedObject1, LockedObject2}, pFunc);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18244 次 |
| 最近记录: |