gpt4 book ai didi

c# - 实现线程安全的队列或列表时,返回Count前是否需要加锁?

转载 作者:太空狗 更新时间:2023-10-30 00:28:06 26 4
gpt4 key购买 nike

当实现线程安全列表或队列时;是否需要在返回 Count 之前锁定 List.Count 属性,即:

//...
public int Count
{
lock (_syncObject)
{
return _list.Count;
}
}
//...

是否因为原来的_list.Count变量可能不是volatile变量,所以需要加锁?

最佳答案

是的,这是必要的,但大多是无关紧要的。如果没有锁,您可能会读取陈旧的值,甚至根据内部工作和 _list.Count 的类型,引入错误。

但请注意,使用 Count 属性是有问题的,任何调用代码都不能真正依赖它:

if (myStore.Count > 0)  // this Count's getter  locks internally 
{
var item = myStore.Dequeue(); // not safe, myStore could be empty
}

因此,您的目标应该是一种将检查计数和对其执行操作相结合的设计:

ItemType GetNullOrFirst()
{
lock (_syncObject)
{
if (_list.Count > 0)
{
....
}
}
}

附加:

is it nessesary to do a lock because of the original _list.Count variable maybe not a volatile variable?

_list.Count 不是变量而是属性。它不能被标记为易变的。是否线程安全取决于属性的getter代码,但通常会是安全的。但是不可靠。

关于c# - 实现线程安全的队列或列表时,返回Count前是否需要加锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4047224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com