gpt4 book ai didi

c# - 在共享数据结构上同步

转载 作者:太空宇宙 更新时间:2023-11-03 18:50:35 27 4
gpt4 key购买 nike

考虑涉及多个线程写入共享数据结构的代码。现在,这些线程中的每一个都将本质上唯一的对象写入共享容器。以下面的(虚构的)例子为例:

class Logger
{
IDictionary<string, Log> logDictionary = new Dictionary<string, Log>();

// Method called by several other threads
void AddLog(Log log)
{
logDictionary[log.ID] = log;
}

// Method called by a separate thread
IList GetLog(/*some criteria*/)
{
// loop through logDictionary and
// create an IList based on criteria
}
}

我清楚地知道,如果多个线程尝试更新导致竞争条件的相同“变量”(或槽),则对共享对象的并发访问可能会成为问题。现在我的问题分为 3 个部分。

(1) 如果线程正在进行盲更新,是否需要同步? (即使他们正在更新相同的插槽/变量)?

(2) 如果每个线程都在写一个唯一的对象,那么假设不需要同步访问共享字典/容器是否是线程安全的?

(3) 另一个线程对 GetLog() 的调用是否真的会带来问题,即使字典正在被其他线程同时更新?

最佳答案

最大的问题是是否有任何线程在字典中添加/删除了一个键。这可能会导致内部进行重大重建(很可能会破坏任何正在进行的竞争读写),所以是的;您确实需要同步访问。如果所有线程都在读/写现有 key ,您可能没问题,但我认为不能保证。

我不知道 java,但在 C# 中有 ReaderWriterLockSlim,它可能(如果您绝对需要它)允许多个并发读取器一个写入器(不是两者都) - 但通常更简单(有时甚至更快)只是去互斥(通过 lock 等)。

编辑

另外 - 对于强类型字典类型(即泛型等),值类型过大,更新不会互锁;另一个线程理论上可以看到这样一个值的正在进行的更新。例如,x86 上的 guid 等。

关于c# - 在共享数据结构上同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/669056/

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