c - 维护CGO中动态库的全局变量状态
问题描述
我通过使用 CGO 在 Go 代码中使用 C 库。问题是似乎每次调用 C 函数时都没有维护全局变量的状态。
这个库有一个全局变量和一系列初始化函数。调用初始化函数没有效果。就好像每个函数执行后分配给库的整个内存都被清除了。并且每个功能都是独立执行的。
有没有人有这方面的经验我应该设置什么?
PS:我没有在 Go 中创建对那些全局变量的引用。此全局变量是尚未导出的结构。它的定义不在库的主 .h 中。有没有办法在不更改 C 库代码的情况下保留这个全局变量?(感谢:TehSphinX)
变量是:swed在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 设置,才能在此处取得任何进展。
推荐阅读
- sql-server - 从 MS Access 更新查询在 SQL Server 中创建存储过程
- java - 从普通链表创建排序链表
- java - 使用 HttpSession 时出现空指针异常
- google-apps-script - 如何使用 Google Apps 脚本将电子表格标题和最后一行值导出到 csv 文件
- ios - 将 Int 数组更改为字符串,以便将其放入 label.text
- python - 如何在python中捕获不是异常的错误消息?
- jquery - 有没有办法使用 jquery 日期时间选择器获得良好的日期格式?
- git - 无法安装自制软件
- r - 零膨胀数据和对数正态分布
- sql - 关于 oracle 数据库“sysdba”用户并创建一个新用户