C# 需要相互排斥
不影响集合的代码需要互斥C# 需要相互排斥,c#,C#,不影响集合的代码需要互斥 List<string> _itemColection = new List<string>(); object _criticalSection = new object(); private void Add(string item) { lock (_criticalSection) { _itemColection.Add(item);
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方法中是否需要互斥。集合值未更改是的,您应该在那里锁定。您正在请求访问共享数据,如果您没有某种内存障碍,则无法保证它是新信息。记忆模型有时会让人大吃一惊: 此外,虽然我希望List.Count是一个非常简单的操作,但理论上它可能很复杂——如果另一个线程正在改变某些东西,例如添加一个项,那么在计算计数时需要缓冲区扩展,理论上你可能会遇到麻烦
基本上,除非某个类型声称对您的特定场景是线程安全的,否则我始终会确保您不会同时对其执行两个操作。简单的答案是肯定的,因为值可能会更改,并且您不会有最新的数据。这是一个关于一致性的好问题 在我看来,当存在某种并发性时,总是有必要使用lock 编辑 我们只使用需要更改某些信息的锁定操作,而不需要在只读对象中使用这些操作
最好的问候实际上可能不需要,但为了安全起见,我会把它包括在内_itemCollection.Count是一个属性,因此您实际上是在对集合调用函数,您无法保证此函数的功能。除非您知道所涉及的类型对于您的操作是线程安全的,例如字符串,或者只是读取静态设置一次且从未更改的字典。确切地说。。。这对我来说是显而易见的。我认为我们只是使用需要更改某些信息的锁定操作。我在回答时忘了说那句话。