gpt4 book ai didi

.net - .NET 垃圾收集器的 stop-the-world 效果是否会停止或延迟非托管线程和计时器回调的执行?

转载 作者:行者123 更新时间:2023-12-04 15:35:01 24 4
gpt4 key购买 nike

我有一个应用程序需要以非常精确的时间间隔执行代码。为此,我还需要通过 timeBeginPeriod 将 Windows 的调度程序分辨率提高到 1 毫秒。 .

为此,我有一个本地 C++ dll,它通过从 TimerQueueTimer 引发的回调来处理所有时间关键的事情。以 1ms 的间隔(所有 native 代码)。

应用程序本身是一个 .NET 应用程序(C#,所以是纯 CLR)。 native dll 使用缓冲,因此 C# 代码本身不需要对时间要求严格,只要它每 50 毫秒左右获得一些执行时间即可。

当垃圾收集器罢工时,这是否也会停止或延迟我程序中任何计时器回调的执行? (换句话说:.NET 程序的不确定性是否会扩展到它使用的 native 代码片段?)我还没有找到这个确切问题的答案。一个指向 MSDN 文档的链接将是最令人放心的。

我正在使用 .NET 4.0

最佳答案

我的直觉是不 - CLR 只会影响托管线程。

  • CLR 不需要停止非托管线程来收集垃圾。
  • CLR 不应该知道进程中的非 CLR 线程:它会违反隔离。想想 IIS 服务器或 SQL 服务器——两者都承载 CLR,但我无法想象 CLR 卡住进程中的所有线程......即使用户的托管代码使用了 WIN32 API 函数(stored-proc/web 应用程序)尝试操作进程中的非托管线程,托管的托管代码甚至不应该具有操作主机的非 CLR 线程所需的安全权限(对于 Windows,CLR 是“又一个 COM 对象”) .

  • 我找不到 MSDN 确认,但您可以尝试证明在垃圾回收期间有一个非托管线程正在运行:有一个非托管线程不断跟踪,并有一个 GC notification mechanism追踪。看到托管线程的跟踪在垃圾收集过程中继续。

    (另外值得注意的是,有几个 GC "modes" ,它们的行为不同)

    关于.net - .NET 垃圾收集器的 stop-the-world 效果是否会停止或延迟非托管线程和计时器回调的执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16655948/

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