gpt4 book ai didi

c# - 在多个线程中添加和删除时 List 中的 null 值

转载 作者:行者123 更新时间:2023-12-03 12:44:06 27 4
gpt4 key购买 nike

我知道 C# System.Collections.Generic.List 对象不是线程安全的。但我想知道为什么这段代码会生成空值。

Task.Run(() =>
{
for (var i = 0; i < 10; i++)
{
var str = $"Test {i}";
list.Add(str);

if (i == 9)
{
i = 0;
}
}
});

Task.Run(() =>
{
while (true)
{
list.Remove("Test 1");
list.Remove("Test 2");
list.Remove("Test 3");
list.Remove("Test 4");
list.Remove("Test 5");
list.Remove("Test 6");
list.Remove("Test 7");
list.Remove("Test 8");
list.Remove("Test 9");
}
});

这是几秒钟后列表的一部分:

enter image description here

如果条目不存在于列表中,则负责从列表中删除条目的线程可能会崩溃。因此,出于其他多线程原因,我理解为什么没有从列表中删除某些对象,但我不明白这些空值是如何生成的。有没有人解释这些值是如何生成的?

最佳答案

List<T>除了 N 次读取和零次写入之外,不是线程安全的;任何非零写入次数 与其他任何东西一起不受支持,并且这种行为是完全未定义的。如果您需要并发:要么添加同步,要么使用并发集合类型。

关于c# - 在多个线程中添加和删除时 List<string> 中的 null 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60396932/

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