1

如果我有:

lock(myLockObject)
{
    mySharedBuffer.Modfiy();
    something.BeginDoStuff(new Action(delegate()
        {
            mySharedBuffer.Modify();
        }));
}

并且提供给 BeginDoStuff() 的回调在另一个线程上被回调 - 最终运行回调时是否持有/重新获得锁?(我认为锁丢失了,我需要再次锁定,但找不到这样说的文档)

4

2 回答 2

2

最终运行回调时是否持有/重新获得锁?

不——没有魔法发生!

BeginXXX立即返回,控制退出lock块并释放锁。

如果您想在回调中再次获得锁,您将需要另一个lock块。

与所有锁定一样,这意味着您必须mySharedBuffer在释放锁定时使对象保持一致状态。BeginXXX此外,在您释放锁之后和您的回调再次获得锁的时间之间,该对象可能被另一个线程修改。


如果 的实现BeginXXX可以同步执行回调,那么调用栈就会像正常的顺序代码一样,仍然会持有锁。在这种情况下,如果你尝试在回调中再次获取锁,它会立即获取,因为Monitor允许在同一个线程上递归获取锁。

于 2013-01-09T12:38:29.300 回答
0

不可以。匿名代表不属于lock地区。

通常 BeginXXX 方法执行异步操作,并立即返回。相应的 EndXXX 方法也在那里等待操作完成。

如果要锁定匿名委托,则需要使用嵌套锁定。

lock(myLockObject)
{
    mySharedBuffer.Modfiy();
    something.BeginDoStuff(new Action(delegate()
        {
            lock (myLockObject) // nested locking here
            {
               mySharedBuffer.Modify();
            }
       }));
}
于 2013-01-09T12:39:59.847 回答