需要相互排斥

时间:2009-03-12 10:56:52

标签: c#

不影响收集的代码需要相互排斥

    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()方法中需要Mutex。集合值不会更改

4 个答案:

答案 0 :(得分:4)

是的,你应该锁定那里。您正在请求访问共享数据,如果您没有某种内存障碍,则无法保证它将是“新鲜”信息。内存模型有时可能是真正的心灵弯曲:)

此外,虽然我期望 List<T>.Count是一个非常简单的操作,但它理论上可能会很复杂 - 如果另一个线程正在改变东西(例如,添加一个项目,然后需要缓冲区扩展),当它计算出计数时,理论上 会遇到麻烦。

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

答案 1 :(得分:1)

在实践中它可能不需要,但我会把它包括在内以保证安全。 _itemCollection.Count是一个属性,所以你有效地在集合上调用一个函数,你无法保证这个函数在做什么。

答案 2 :(得分:0)

简单回答是肯定的,因为值可能会更改,您将无法获得最新数据。

答案 3 :(得分:0)

这是关于确定性的一个极好的问题..

在我看来,当你遇到一些并发时,总是需要使用锁。

修改

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

祝你好运