c# - 需要相互排斥

标签 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()方法中是否需要互斥锁。收藏值(value)不变

最佳答案

是的,你应该锁在那里。您正在请求访问共享数据,如果您没有某种内存屏障,则无法保证它将是“新鲜”信息。内存模型有时确实令人费解:)

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

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

关于c# - 需要相互排斥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/638115/

相关文章:

c# - 在 C# 中创建 Outlook .MSG 文件

c# - 使用 ASP.NET Session 进行生命周期管理 (Unity)

c# - WPF ListView 项目重复

c# - SQL 不会更新数据库

c# - 如何在 Xunit 中测试使用 List<List<T> 作为输入参数的方法

c# - 生成没有忽略值的随机字节数组

c# - Amazon S3 删除子文件夹及其内容 C#

c# - 如何将 C# 8.0 可空引用类型与 Entity Framework Core 模型一起使用?

c# - C# 中 ClientCredentials 的 Java 对应项?

c# - 用于输出或触发的不同连接字符串