gpt4 book ai didi

.net - 在多线程环境中访问.NET词典

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

我想使用if-lock-if模式检查多线程环境中字典中是否存在对象。因此,我正在考虑的代码如下所示:

private IDictionary<string, SomeType> m_dic = new Dictionary<string, SomeType>();

private SomeType GetSomeObject(string key)
{
SomeType obj;
if (!m_dic.TryGetValue(key, out obj))
{
lock(m_dic)
{
if (!m_dic.TryGetValue(key, out obj))
{
m_dic[key] = obj = CreateSomeObject(key);
}
}
}
return obj;
}

我的假设是,即使另一个线程现在正在同一键处插入对象,TryGetValue也不会返回部分设置的引用(.NET中不存在这样的东西,对吗?),而是它将返回null。因此,我们进入 protected 部分并重复检查。

我的问题是我的假设正确,代码正确吗?

谢谢。

编辑

让我施加一个限制。字典实际上是单例对象的字典。因此,一旦一个条目被占用,它就永远不会改变。就像单例的Instance属性一样,一旦设置,就永远不会更改。在这种限制下,我们可以使用if-lock-if模式吗?

最佳答案

为清楚起见进行了编辑:

不,这是一个非常糟糕的想法。您可以在简单和原子的东西(int)上玩if-lock游戏,但是Dictionary是具有多个 Activity 部分的类。读取和写入必须始终保持同步,请参阅this MSDN page上的ThreadSafety部分。

关于.net - 在多线程环境中访问.NET词典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1593628/

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