为了账号安全,请及时绑定邮箱和手机立即绑定

CGO 块中的全局变量 - GO 中的内存泄漏和线程安全

CGO 块中的全局变量 - GO 中的内存泄漏和线程安全

Go
森栏 2022-06-06 15:50:24
我试图弄清楚是否存在与 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 somethinginit无论如何)。


查看完整回答
反对 回复 2022-06-06
  • 1 回答
  • 0 关注
  • 171 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信