我试图弄清楚是否存在与 CGO 块中声明的全局变量相关的线程安全和/或内存泄漏问题。这是一些伪代码:/* char* globalchar;int globalnum;void init() { globalchar = "do something";}int process() { if (globalchar==NULL) { init(); } globalnum=0; while (condition test) { dosomething_that_takes_time(); globalnum++ } return globalnum;}*/import "C"func goproc() { val := int(C.process())}goproc() 被多个线程调用。问题1. globalnum 线程安全吗?它可以同时被不同的线程操作吗?问题 2. 在这种模式下执行 init() 是否只运行一次可能会出现问题?在 Java 中使用单例模式时,我们会“同步”init() 方法以确保只有一个人可以同时运行它。问题 3. globalnum 和 globalchar 会自动进行垃圾回收吗?我注意到很多:defer C.free(unsafe.Pointer(somecpointer))。这是否需要使用在 CGO 块中声明的全局变量来完成?任何意见将是有益的。谢谢!
1 回答
泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
关于问题 1:不,这不安全。在某处使用互斥锁(在 C 代码本身中,很可能是使用 POSIX 风格的互斥锁)来同步对共享数据的访问。或者,如果您愿意,可以使用 C11 原子整数。
关于问题 2:这也不安全。在某处使用互斥锁。
关于问题 3:全局 C 变量不需要 GC。一个不是指针,另一个是指向保存 C 字符串文字的静态持续时间 C 内存的指针do something
(init
无论如何)。
- 1 回答
- 0 关注
- 171 浏览
添加回答
举报
0/150
提交
取消