gpt4 book ai didi

C# 监视器(来自 Java 开发人员的 POV)

转载 作者:行者123 更新时间:2023-12-02 07:45:56 25 4
gpt4 key购买 nike

我正在将 C#/directx 游戏客户端移植到 Java,这样我就可以学习一些 C#(因为我完全不喜欢它),同时提高我对 java opengl 引擎的知识。

当我遇到类似以下情况时:

Monitor.Enter(preloadDictionary);
try {
foreach (PreloadEntry entry in preloadDictionary.Values) {
if (entry.loaded) continue;
return entry;
}
} finally {
Monitor.Exit(preloadDictionary);
}

我可以假设它像下面这样吗?

syncronized(preloadDictionary) {
[...]
}

对于以下情况:

Monitor.Enter(worldServerMap);
try {
worldServerMap[rv.WorldName] = entry;
Monitor.PulseAll(worldServerMap);
} finally {
Monitor.Exit(worldServerMap);
}

附加的PulseAll()是否像notifyAll()一样唤醒所有等待资源的线程? (但我在代码中找不到调用 Monitor.Wait() 的任何位置)。

最佳答案

lock(x) 与最后的 Monitor.Enter 和 Monitor.Exit 相同。这是一个语言快捷方式。

如果你问我,它是 C# 语言的较弱部分之一 - 只是因为虽然有 MINOTIR 时它很好,但现在有各种版本的监视器(slim、spinlock 等)和仅锁定支持其中之一。这很方便,但我不确定这是否明智;)

is the additional PulseAll() like a notifyAll() to wake up all thread waiting on the resource? (but i could not find any place in the code where Monitor.Wait() is called).

PulseAll 没有什么意义,除非你有一个明确的等待,可能来自其他不想输入的线程。 Enter如果得不到锁就会等待,所以Exit足以进行正常同步。

我会开始寻找等待或其他东西 - 监视器上的 PulseAll 仅当您有线程等待且在此阶段不尝试进入时才有意义。这可能会导致一个糟糕的设计问题,基本上让他们等待然后获得脉冲然后尝试进入,它可能是某些 dsort 的非阻塞设计的一部分 - 很难说,但这是不寻常的。除非您可以在代码中的某处找到 Wait,否则我可能会尝试杀死 PulseAll 并看看会发生什么。

关于C# 监视器(来自 Java 开发人员的 POV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10871072/

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