gpt4 book ai didi

C# 在多线程应用程序中交换变量引用时需要锁定

转载 作者:可可西里 更新时间:2023-11-01 08:05:56 24 4
gpt4 key购买 nike

我有一个应用程序,我希望多个线程读取一个列表。我想定期用新数据更新列表。列表更新后,我想我可以创建一个新列表并将其替换为旧列表。示例:

private List<string> _list = new List<string>();
private void UpdateList()
{
var newList = new List<string>(QueryList(...));
_list = newList;
}

private void ThreadRun()
{
foreach (var item in _list)
{
// process item...
}
}

在 UpdateList 方法中,创建了一个新列表,并将 _list 引用与新列表交换。根据我的想法,任何现有线程仍将保留对旧列表的引用(这对我来说没问题),任何新线程都会选择新列表。最终,所有线程都将结束,旧列表最终将被垃圾收集。此代码中是否需要任何锁定,或者我需要注意什么以确保安全的多线程访问?

最佳答案

要确保陈旧和优化都不会伤害您,请使用 Interlocked.Exchange() 更新该字段。然后,您将在写入时拥有适当的内存屏障,而无需在每次读取时都使用 volatile

关于C# 在多线程应用程序中交换变量引用时需要锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8898529/

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