【发布时间】:2020-07-22 18:01:22
【问题描述】:
我有一个可以被多个线程访问或修改的私有集合(例如ISet<int>)。
我的逻辑是这个线程只需要在某些状态下改变ISet,而另一个线程总是需要改变它。另一个线程将始终采用lock,在ISet 上实现lock 关键字,如下所示:
lock (this._set)
{
// some mutating operation on this._set
}
对于这个线程,如果ISet 包含一个称为currentValue 的int,我只需要执行一个改变线程的操作,这在这种情况下很少见。另一个线程中的操作很频繁。因此问题是我是否可以在获取lock 之前检查ISet 是否包含currentValue,以尽量减少该线程阻塞另一个线程的时间,如下所示:
if (this._set.Contains(currentValue))
{
lock (this._set)
{
if (this._set.Contains(currentValue))
{
// some mutating operation on this._set
}
}
}
问题是lock 之外的检查行为是否未定义,或者是否会导致ISet 进入未定义或意外状态。当然返回的实际值不能被信任使用,这就是为什么在lock 中再次检查它的原因,但这是我可以期望工作的有效优化,还是会弄乱集合的某些内部状态?目标是尽可能少地使用此线程中的lock。
【问题讨论】:
-
ConcurrentDictionary是否可以满足您的需求? -
当你说集合可以被多个线程访问或修改,你的意思是集合是线程安全的吗?
标签: c# multithreading thread-safety locking task-parallel-library