不影响集合的代码需要互斥
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/