如何解决在CGO中维护动态库全局变量的状态
我通过使用 CGO 在 Go 代码中使用 C 库。问题是每次调用C函数时似乎都没有维护全局变量的状态。
这个库有一个全局变量和一系列初始化函数。调用初始化函数无效。就好像在每个函数执行后,分配给库的整个内存都被清除了。并且每个函数都是独立执行的。
有没有人有这方面的经验,我应该设置什么?
PS:我没有在 Go 中创建对这些全局变量的引用。这个全局变量是一个尚未导出的结构体。它的定义不在库的主 .h 中。有没有办法在不更改 C 库代码的情况下保留这个全局变量? (感谢:TehSphinX)
变量是:swed in https://www.astro.com/ftp/swisseph/src/sweph.h
extern TLS struct swe_data swed;
解决方法
您声明中的 TLS
表明 C 库正在使用 Thread Local Storage。这意味着全局变量的实例不止一个。您所看到的是如何从不同的 C 语言级线程访问不同的实例,从而导致访问不同的变量。
Go 的 goroutine 和 C 语言级线程之间没有定义的绑定。 Go 执行器(“M”,在内部运行时,从一个 Go 版本更改为另一个版本)实际上位于许多系统上的 POSIX 样式线程之上,但是 goroutine 可能会相当不可预测地从一个线程跳到另一个线程。为了让 TLS 正常工作,您保证对 C 代码的调用会落在某个线程中并保持在那里,直到 C 代码返回到 Go 代码为止。您无法保证且无法控制的是此时运行哪个 C 线程。
您必须选择某种方法来坚持使用一个特定的 C 线程,或者击败 TLS 设置,才能在此处取得任何进展。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。