gpt4 book ai didi

c# - 当可能存在迭代器时替换并发集合是否是线程安全的?

转载 作者:行者123 更新时间:2023-12-01 19:46:00 24 4
gpt4 key购买 nike

我一直在阅读各种内容,看起来这应该可行,但我想确定一下。我有一个静态属性,它应该是一个缓存(加上一些与缓存数据相关的其他功能)。它将实际数据存储在 ConcurrentBag 中,并且有一个 IEnumerable 方法来[过滤并]从此包中生成返回值。它会像这样更新自己:

ConcurrentBag<Foo> NewBag = GetNewThings();
Cache = NewBag;

从我读到的内容来看,这似乎应该有效,尽管我没想到会这样。我预计这会炸毁发生这种情况时正在读取的所有迭代器。但是我读到,如果另一个线程正在迭代旧列表,它将在新列表被交换时完成列表的该实例。第二个(新)线程将在新列表上启动,即使旧线程仍在迭代其旧实例。这看起来很神奇,所以我可能是错的,是吗?

其他线程仅迭代列表,唯一的写入发生在这两行上。

最佳答案

I read that if another thread were iterating through the old list, it would finish on that instance of the list while the new list gets swapped. A second (new) thread would start on the new list, even while the old thread is still iterating through their old instance. This seems magic though, so I'm probably wrong, yes?

您所读到的内容是正确的。

这是线程安全的,但您可能希望使变量 volatile 或使用Volatile.ReadVolatile.Write来确保所有线程的即时可见性。

关于c# - 当可能存在迭代器时替换并发集合是否是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28327422/

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