【问题标题】:In a C# multi-threaded environment, is it necessary to lock getter and setter of enumerable objects too? [duplicate]在 C# 多线程环境中,是否也需要锁定可枚举对象的 getter 和 setter? [复制]
【发布时间】:2021-06-19 15:50:21
【问题描述】:

在这样的 C# 多线程环境中:

public class Indexes
{
    private object Lock { get; }
    private List<Index> Items { get; set; }

    public Indexes()
    {
        Lock = new object();
        Items = new List<Index>();
    }

    public void Add(Index item)
    {
        lock (Lock)
        {
            Items.Add(item);
        }
    }

    public void Replace(List<Index> items)
    {
        lock (Lock) // Is locking required here?
        {
            Items = items;
        }
    }
}

是否也需要锁定可枚举对象的getter和setter?

【问题讨论】:

  • 我不得不问 - 为什么你要更改对象引用而其他线程正在枚举它?
  • 有许多内置类型提供各种线程安全组合(例如并发集合与不可变集合)。您是否考虑过寻找已经满足您要求的产品,而不是尝试构建自己的产品。如果找不到,请考虑清楚地描述您的要求是什么。
  • 您的代码示例中没有多个线程,因此据我们所知,您根本不需要lock。您是否确实需要它,如果需要,如何使用它,已经广泛地介绍过了。见重复。如果您发现您的代码使用了lock,但没有按预期工作,请随时发布一个问题,其中包含正确的minimal reproducible example,并详细说明代码的作用,有何不同从你想要什么,以及具体你需要什么帮助。

标签: c# multithreading


【解决方案1】:

假设您是一名在多线程方面具有中等专业知识的开发人员,并且您希望能够推断您的应用程序的正确性,是的,需要保护对您的应用程序的可变共享状态的所有访问。不仅而且共享字段都应该受到保护。

另一方面,如果 you are an expert 在所有主要 CPU 架构上的内存模型/缓存一致性协议中使用,您也许可以使用低锁/无锁多线程技术。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 2015-07-21
    • 1970-01-01
    相关资源
    最近更新 更多