【问题标题】:Does finally { _someLock.EnterWriteLock(); } make any sense?最后 { _someLock.EnterWriteLock();有什么意义吗?
【发布时间】:2013-12-02 08:30:39
【问题描述】:

我在一个大项目的代码中看到了这样的模式:

try {} finally { _someLock.EnterWriteLock(); }

try
{
...
}
finally
{
   _someLock.ExitWriteLock();
}

最后进入 lock in 有什么意义吗?

====================

更新: 我找到了这种模式的来源。

http://chabster.blogspot.com/2013/07/a-story-of-orphaned-readerwriterlockslim.html 。你能说什么?

【问题讨论】:

  • 有一个空的try 块? IMO ...不,没有意义(并且可能会被编译器优化掉)。如果try 块不是空的,那么它可能是一些疯狂的逻辑程序流(!)的一部分。
  • @Adriano 第一次尝试是 emty,第二次包含文件删除逻辑等等
  • 第一个没有意义,但你已经知道了,对吧?
  • 那么 IMO 就没用了。 AFAIK finally 块不会启用任何特殊的编译器/JIT/CLR 行为。
  • @flup 是的,但我很惊讶......我想 - 也许我不知道什么......

标签: c# .net multithreading locking


【解决方案1】:

不,它没有。 Empty try/finally 块防止执行 finally,即使线程在到达try 块时被中止。

事实上,在你的情况下它是有害的。

考虑执行try时是否抛出线程中止异常

try
{
    //Thread is here and abort requested
}
finally { _someLock.EnterWriteLock(); }//Aborted thread takes the lock!

try
{
...
}
finally
{
   _someLock.ExitWriteLock();//Never gonna execute since thread is aborted. You're screwed.
}

【讨论】:

  • @BransDs:根据我的其他评论,您链接的文章中的代码与您发布的代码不同。您发布的内容具有 Sriram 在此处概述的风险;文章中的代码没有。
  • @DanPuzey 这篇文章解释了为什么这很有用。该链接向我发送此问题中的代码作者
  • @BransDs 我同意丹的观点,两个代码都不一样。请注意有 nested 尝试。这里不一样。
  • 如果有 finally 块内有多个指令,这是有意义的。 EnterWriteLock() 在这种情况下 受到保护 因此在这种情况下它是无用的(无用 = 无害且不好,因为 它的行为方式完全相同,无论有无 @ 987654326@块)。
【解决方案2】:

不,它没有。也许如果你想混淆你的代码

【讨论】:

    猜你喜欢
    • 2016-09-16
    • 2010-09-23
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 2011-05-04
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多