C# 需要相互排斥

C# 需要相互排斥,c#,C#,不影响集合的代码需要互斥 List<string> _itemColection = new List<string>(); object _criticalSection = new object(); private void Add(string item) { lock (_criticalSection) { _itemColection.Add(item);

不影响集合的代码需要互斥

    List<string> _itemColection = new List<string>();
    object _criticalSection = new object();

    private void Add(string item)
    {
        lock (_criticalSection)
        {
            _itemColection.Add(item);
        }
    }

    private void Remove(string item)
    {
        lock (_criticalSection)
        {
            _itemColection.Remove(item);
        }
    }

    private void GetCount()
    {
        ///Is it lock is reuired here?
        return _itemColection.Count;
    }

    //Thread method
    private void Run()
    {
        lock (_criticalSection)
        {

            foreach (string item in _itemColection)
            {
                ///Some operation
            }
        }
    }

GetCount方法中是否需要互斥。集合值未更改

是的,您应该在那里锁定。您正在请求访问共享数据,如果您没有某种内存障碍,则无法保证它是新信息。记忆模型有时会让人大吃一惊:

此外,虽然我希望List.Count是一个非常简单的操作,但理论上它可能很复杂——如果另一个线程正在改变某些东西,例如添加一个项,那么在计算计数时需要缓冲区扩展,理论上你可能会遇到麻烦


基本上,除非某个类型声称对您的特定场景是线程安全的,否则我始终会确保您不会同时对其执行两个操作。

简单的答案是肯定的,因为值可能会更改,并且您不会有最新的数据。

这是一个关于一致性的好问题

在我看来,当存在某种并发性时,总是有必要使用lock

编辑

我们只使用需要更改某些信息的锁定操作,而不需要在只读对象中使用这些操作


最好的问候

实际上可能不需要,但为了安全起见,我会把它包括在内_itemCollection.Count是一个属性,因此您实际上是在对集合调用函数,您无法保证此函数的功能。

除非您知道所涉及的类型对于您的操作是线程安全的,例如字符串,或者只是读取静态设置一次且从未更改的字典。确切地说。。。这对我来说是显而易见的。我认为我们只是使用需要更改某些信息的锁定操作。我在回答时忘了说那句话。