【问题标题】:Do I need to use and assignment with a lock?我需要使用和分配锁吗?
【发布时间】:2012-09-12 11:15:19
【问题描述】:

这可能是一个愚蠢的问题,但我是否需要使用和分配锁,或者我可以简单地返回结果。

例如:

我有一个私有帮助方法,它返回一个 IEnumerable 文件名列表。它使用锁来确保方法在迭代 m_transfers 集合时是线程安全的。

我需要一份作业吗...

IEnumerable<String> updated;
lock (m_transfers.Lock)
{
    updated = m_transfers.Values.Where(transfer => transfer.Updated)
                         .Select(transfer => transfer.Filename);
}
return updated;

或者我可以这样做

lock (m_transfers.Lock)
{
    return updated = m_transfers.Values.Where(transfer => transfer.Updated)
                            .Select(transfer => transfer.Filename);
}

【问题讨论】:

  • 更重要的是:所有其他对m_transfers.Values 的访问是否也受到保护?看起来您可能根本不需要lock()

标签: c# .net multithreading linq


【解决方案1】:

不,您不需要添加额外的变量;无论哪种方式,语义都是相同的,因为在任何一种情况下,我们只有在放弃锁定后实际上返回值。

由于该变量没有任何用途,我将删除它并使用第二个版本 - 尽管技术上,编译器实际上还是将它放回了(lock 涉及 @987654322 @/finally,而在 IL 级别,您不能在 try 内部进行 ret;因此编译器实际上像您的第一个版本一样编写它。

【讨论】:

  • 感谢您的回复。很好的帮助。
【解决方案2】:

tryusing 的情况相同,您不必在此处执行此操作。编译器在函数退出时为您提供所需的代码。

查看更多信息:Monitor vs lock

【讨论】:

    【解决方案3】:

    两者都是有效的。
    一旦您返回执行,就会退出块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多