作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 Visual Studio 2008 C# .NET 3.5 项目,我希望其中有一个 Foo
的线程安全池对象。
public class FooPool
{
private object pool_lock_ = new object();
private Dictionary<int, Foo> foo_pool_ = new Dictionary<int, Foo>();
// ...
public void Add(Foo f)
{
lock (pool_lock_)
{
foo_pool_.Add(SomeFooDescriminator, f);
}
}
public Foo this[string key]
{
get { return foo_pool_[key]; }
set { lock (pool_lock_) { foo_pool_[key] = value; } }
}
public IEnumerable<Foo> Foos
{
get
{
lock (pool_lock_)
{
// is this thread-safe?
return foo_pool_.Select(x => x.Value);
}
}
}
}
是 public IEnumerable<Foo> Foos { get; }
函数线程安全?或者,我是否需要克隆结果并返回一个新列表?
最佳答案
不,不是。
如果另一个线程在您的调用者枚举字典时向字典添加内容,您将收到错误消息。
相反,您可以:
lock (pool_lock_) {
return foo_pool.Values.ToList();
}
关于c# - 返回 IEnumerable<> 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10232631/
我是一名优秀的程序员,十分优秀!