gpt4 book ai didi

c# - c#中的并行任务和线程安全

转载 作者:太空宇宙 更新时间:2023-11-03 13:52:00 33 4
gpt4 key购买 nike

我有两个独立的任务和两个独立的操作。我认为 t0 是线程安全的,但我不确定 t1。这是对的吗?并发字典的性能很糟糕,我需要向集合中插入大量数据。

var t0 = new Task[2]
{
Task.Factory.StartNew(()=>
{
list1=new sortedlist<int,int>(sortedlist1)
}
}),
Task.Factory.StartNew(()=>
{
list2=new sortedlist<int,int>(sortedlist2)
})
};
Task.WaitAll(t0)

var t1 = new Task[2]
{
Task.Factory.StartNew(()=>
{
foreach (var item in sortedlist1)
{
list1.Add(item.Key, item.Value);
}
}),
Task.Factory.StartNew(()=>
{
foreach (var item in sortedlist2)
{
list2.Add(item.Key, item.Value);
}
})
};
Task.WaitAll(t1)

最佳答案

如所写,此代码不起作用。第一对任务中分配的列表不会分配给第二对任务使用的变量。让我们忽略它,只看这里的一般概念。

这两个列表不必在单独的线程中分配以在单独的线程中使用。而且您绝对不需要在单独的任务中浪费精力分配每个列表。列表可以由主线程分配,特别是当主线程在任务完成后想要使用列表时。唯一真正的问题是是否存在两个线程同时修改一个列表的可能性。

如果list1只被task1读写,list2只被task2读写,那么你可以在各自的任务中对列表做任何你想做的事情,不会有任何冲突。

像您已经在做的那样使用 Task.WaitAll 来等待两个任务完成。两个任务都完成后,主线程就可以控制list1和list2做进一步的修改。在诸如此类的一组并行执行的任务之后,一个常见的后续操作是将多个任务的工作合并到最终输出中。 (参见“MapReduce”)

关于c# - c#中的并行任务和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13449019/

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