重新初始化concurrentbag是线程安全的吗

本文关键字:安全 线程 初始化 concurrentbag | 更新日期: 2023-09-27 18:22:14

我有一个concurrentbag的一个编写器和多个读取器。

编写器定期刷新数据库中concurrentbag的完整内容。

在编写器线程内重新初始化(即新的concurrentbag)线程安全吗?如果没有,我认为唯一的选择是在所有读写过程中锁定它,这完全违背了这一点。我不能一次迭代一个袋子来清空它,因为任何读取粪便的过程都会基于部分信息。

谢谢大家!

重新初始化concurrentbag是线程安全的吗

首先,这与ConcurrentBag类型无关。就这一点而言,它将是完全安全的。

如果在一个线程上,方法调用是在包上进行的,而同时在另一个线程中,则执行以下操作:

_BagField = new ConcurrentBag<string>();

然后,第一个线程上的方法调用将很好地完成,但在旧实例上

然而,是不安全的,但由于首先使用该类型的原因,:

if (_BagField.Any())
    var percentage = 100 / _BagField.Count(); // broken

这可能会在一个实例上调用.Any(),在另一个实例中调用.Count(),但这从来都不是安全的,因为没有任何保护措施可以确保在调用Any之后Count不会降为零。

但是,请注意,您不能保证其他线程会立即获取新实例。

例如:

string temp;
while (!_Bag.TryTake(out temp))
{
    // process temp
}

可能永远不会到达新实例,并将在停止之前继续处理旧的bag实例。

为确保这一点,请确保包含行李参考的字段为volatile