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

我试图弄清楚是否存在与 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 块中声明的全局变量来完成?


任何意见将是有益的。谢谢!


森栏
浏览 172回答 1
1回答

泛舟湖上清波郎朗

关于问题 1:不,这不安全。在某处使用互斥锁(在 C 代码本身中,很可能是使用 POSIX 风格的互斥锁)来同步对共享数据的访问。或者,如果您愿意,可以使用 C11 原子整数。关于问题 2:这也不安全。在某处使用互斥锁。关于问题 3:全局 C 变量不需要 GC。一个不是指针,另一个是指向保存 C 字符串文字的静态持续时间 C 内存的指针do something(init无论如何)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go