gpt4 book ai didi

c# - 字典和锁 C# 的奇怪问题

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

目前我有一个关于锁定字典的非常奇怪的问题。我有两个不同的线程访问字典,一个线程放入一些条目,另一个线程试图读出它们。创建条目时一切正常,当我尝试从字典中提取一些值时出现了最奇怪的问题。

这是它的样子

 lock (myDictionary)
{
//Add an entry here for a key.
}

//检索

lock(myDictionary)
{

if (myDictionary.ContainsKey(key))
myDictionary.TryGetValue(key, out store);
}

一个线程一进入上面的代码,就找不到keys了。但是如果我写下面的内容

lock(myDictionary)
{
Console.WriteLine(myDicionary.Count)
if (myDictionary.ContainsKey(key))
myDictionary.TryGetValue(key, out store);
}

不知何故,我看到了同一个字典,其中包含在先前代码中找不到的键。现在你们可以争辩说发生的事情是 I/O 延迟导致字典有足够的时间来存储一些值,但是我没有任何超时或导致我失去任何处理的东西,这意味着直到字典包含一些值要提取,下一个处理步骤将不会发生,我的程序将等到它获得一些值。但不幸的是,除非我放置一个 Console.WriteLine ,否则这不会发生......以前有人遇到过这种情况吗?

最佳答案

问题很可能出在您未显示的代码中。您描述的问题类型在多线程场景中非常常见:一切都归结为时序,当您稍微更改代码时,时序会有所不同。在您的特定情况下,您尝试访问的任何值都存在或不存在,具体取决于其他线程中发生的事情的时间。当您的代码找不到它时,很可能该值尚未放在那里或已被删除,但当您的代码看不到它时它存在。

如果没有看到您的其余代码,尤其是向集合写入/删除集合的部分,就无法确定。

一些其他的事情:

  • 您需要锁定读写权限
  • 即使您同时锁定了读和写访问权限,您也无法保证某个对象在那里,除非您还使用了一些其他类型的同步
  • 正如其他人所说,将 ContainsKeyTryGetValue 结合使用没有多大意义,按照您编写的方式。 “TryGetValue”存在,因此您无需调用 ContainsKey:如果值存在,它将立即返回给您,如果不存在,方法调用的结果会告诉您这一点。

关于c# - 字典和锁 C# 的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6028054/

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