为了学习C#本地互操作性,我正在开发一个OpenGL包装器。OpenGL API本身是一个绑定到特定线程的状态机。当包含本地资源的对象被垃圾回收时,终结器在GC线程中运行,并且不能直接释放资源。
我目前采用的解决方法是在上下文对象中建立一个列表,对象将其资源添加到其中,在绘制循环的安全点迭代并释放它们。
然而,这样做的问题是,如果GC在迭代该列表时进行了集合修改,则foreach会失败。 我不能只是在列表周围放置互斥体,因为GC在大多数实现中都是停止整个程序,如果绘制循环已经锁定了它,则永远无法完成迭代并再次解锁它。
通常MTBF是游戏玩耍时间的两个小时左右,但如果故意进行应力测试,每秒几千个对象,它只需要几秒钟就会发生。
在这里可能最好的方法是什么?
我目前采用的解决方法是在上下文对象中建立一个列表,对象将其资源添加到其中,在绘制循环的安全点迭代并释放它们。
然而,这样做的问题是,如果GC在迭代该列表时进行了集合修改,则foreach会失败。 我不能只是在列表周围放置互斥体,因为GC在大多数实现中都是停止整个程序,如果绘制循环已经锁定了它,则永远无法完成迭代并再次解锁它。
通常MTBF是游戏玩耍时间的两个小时左右,但如果故意进行应力测试,每秒几千个对象,它只需要几秒钟就会发生。
在这里可能最好的方法是什么?
using
/Dispose()
而不是使用终结器。 - Marc GravellDispose
时引用计数达到0时才释放未受管理的数据。 - Dirk