【问题标题】:How to create a custom thread-safe IList<T>?如何创建自定义线程安全的 IList<T>?
【发布时间】:2016-11-14 11:04:40
【问题描述】:

我对@9​​87654321@ 运算符有疑问:

例如,我有一个自定义的线程安全(我希望)列表:

public class BlockingList<StateMessage> : IList<StateMessage>
{
    private List<StateMessage> _list = new List<StateMessage>();
    private object _sync = new object();


    public void Add(StateMessage item)
    {
        lock (_sync)
            _list.Add(item);
    }

    public bool Remove(StateMessage item)
    {
        lock (_sync)
        {
            return _list.Remove(item);
        }
    }

    public void Clear()
    {
        lock (_sync)
            _list.Clear();
    }
}

那么,如果第一个线程添加了一个元素,而第二个线程同时调用了Clear() 方法,那它是线程安全的吗?

【问题讨论】:

  • 是的,因为他们首先锁定或等待锁定_sync
  • 但是要补充一点——如果你正在实现IList&lt;StateMessage&gt;,那么你需要实现更多的方法,包括GetEnumerator()ContainsCountthis[int index] ... 等等。我假设您已经意识到这一点,并且上面的代码只是您整个代码的 示例
  • @rbm,是的,我知道它只是一个示例代码。我在我的代码中实现了所有方法。
  • 好的,很酷。除非你真的需要实现自己的线程安全列表,否则你总是可以使用内置类型,比如ConcurrentBag&lt;T&gt;
  • @rbm,我知道ConcurrentBag 和其他集合。但我想清除所有项目而不使用while 循环等,

标签: c# multithreading list locking


【解决方案1】:

是的,您的代码是线程安全的,因为方法首先锁定或等待锁定 _sync 对象。

如果您不想自己编写,可以使用ConcurrengBag。虽然它没有 Clear 方法,但您可以简单地创建一个 ConcurrentBag 的新实例并替换旧实例。

【讨论】:

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