为了学习 C# 本机互操作,我一直在研究 OpenGL 包装器。OpenGL API 本身是一个绑定到特定线程的状态机。当一个包含原生资源的对象被垃圾回收时,终结器在 GC 线程中运行,不能直接释放资源。
我目前拥有的解决方法是在上下文对象中有一个列表,对象将其资源添加到该列表中,并在绘制循环中的安全点进行迭代并释放它们。
但是,这样做的问题是,如果 GC 在迭代该列表时收集,则 foreach 将失败,因为该集合已被修改。我不能只在列表周围放置一个互斥锁,因为在大多数实现中 GC 是停止世界的,如果绘制循环已锁定它,它永远不会完成迭代并再次解锁它。
通常,MTBF 大约是两个小时的游戏时间,但如果有意以每秒几千个对象进行压力测试,它只会在几秒钟内发生。
这里最好的方法是什么?