重新初始化concurrentbag是线程安全的吗
本文关键字:安全 线程 初始化 concurrentbag | 更新日期: 2023-09-27 18:22:14
我有一个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
。