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

Global variables in CGO block - memory leak and thread safety in GO

我想弄清楚是否存在与 CGO 块中声明的全局变量相关的线程安全 and/or 内存泄漏问题。这是一些伪代码:

/*    
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 中使用单例模式时,我们 "synchronize" init() 方法以确保只有一个人可以同时 运行 它。

问题3. globalnum 和globalchar 会自动进行垃圾回收吗?我注意到很多:延迟 C.free(unsafe.Pointer(somecpointer))。是否需要使用 CGO 块中声明的全局变量来完成?

任何建议都会有所帮助。谢谢!

回复问题1:不,这不安全。在某处使用互斥锁——在 C 代码本身中,最有可能使用 POSIX 样式的互斥锁——来同步对共享数据的访问。或者,如果您愿意,可以使用 C11 原子整数。

回复问题2:这也不安全。在某处使用互斥量。

回复问题3:全局C变量不需要GC。一个不是指针,另一个是指向保存 C 字符串文字 do something(无论如何在 init 之后)的静态持续时间 C 内存的指针。