gpt4 book ai didi

c# - C# 中的垃圾收集;在特定线程中处理对象

转载 作者:行者123 更新时间:2023-11-30 17:05:08 25 4
gpt4 key购买 nike

为了学习 C# 原生互操作,我一直在研究 OpenGL 包装器。 OpenGL API 本身是一个绑定(bind)到特定线程的状态机。当包含 native 资源的对象被垃圾回收时,终结器在 GC 线程中运行,不能直接释放资源。

我目前的解决方法是在上下文对象中有一个列表,对象将它们的资源添加到该列表,并在绘制循环中的安全点迭代并释放它们。

然而,这样做的问题是,如果 GC 在遍历该列表时进行收集,则 foreach 将失败,因为该集合已被修改。我不能只在列表周围放置一个互斥体,因为在大多数实现中 GC 都是停止世界的,如果绘制循环锁定了它,它永远不会完成迭代并再次解锁。

通常,MTBF 大约是两个小时的游戏时间,但如果有意对每秒几千个对象进行压力测试,它会在几秒钟内发生。

这里最好的方法是什么?

最佳答案

然后您将硬着头皮停止依赖 GC 为您进行资源管理。你将不得不让你的 Assets 管理器有一个明确的功能来删除它分配的对象,而不是依赖于 Assets 管理器的终结器功能。而且您将不得不在代码中的特定位置调用该函数。

仅仅因为您拥有 GC 并不意味着它是最好的或唯一的解决方案。

关于c# - C# 中的垃圾收集;在特定线程中处理对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16854887/

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