【发布时间】:2014-11-03 06:34:44
【问题描述】:
我为 C++ 库创建了一个 C 包装器,并从我的 C# 托管代码中调用此 C 包装器。我面临的问题是这个库涉及数千次迭代和长运行时间。显然,我需要一种与 C# 程序通信并更新 C/C++ 库正在进行的处理状态的方法。
直截了当的方法是在固定数量的迭代后返回,更新状态并再次调用 C/C++ 包装器。但处理依赖于一些基于 C++ STL 的数据结构,这些数据结构在每次迭代后都会更新。我的托管代码不需要这些数据结构,但显然它们必须保存在内存中以进行所有迭代。
所以在处理完成之前我不能从 C/C++ 包装器返回,否则 C++ 结构将被释放...
我认为最好的方法是在托管代码和非托管代码之间共享一些变量,并每 N 次迭代读取一次处理状态。但这又引出了另一个问题:如何同步访问这块内存?
【问题讨论】:
-
为什么当包装器返回时数据结构会被释放?
-
因为它们是由被调用函数分配的。使用全局变量或未释放的动态内存似乎是一种肮脏且不稳定的解决方案。我可以确定在调用包装器后不会清除此动态内存或全局变量吗?如果 DLL 被卸载了怎么办?