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

CGO块中的全局变量-GO中的内存泄漏和线程安全,c,pointers,go,cgo,C,Pointers,Go,Cgo,我试图找出是否存在与CGO块中声明的全局变量相关的线程安全和/或内存泄漏问题。下面是一些伪代码: /* char* globalchar; int globalnum; void init() { globalchar = "do something"; } int process() { if (globalchar==NULL) { init(); } globalnum=0; while (condition test) { dosomethi

我试图找出是否存在与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:不,这不安全。在C代码本身的某个地方使用互斥锁,最有可能的是,使用POSIX风格的互斥锁来同步对共享数据的访问。或者,如果您愿意,可以使用C11原子整数

关于问题2:这也不安全。在某处使用互斥


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

关于问题1:不,这不安全。在C代码本身的某个地方使用互斥锁,最有可能的是,使用POSIX风格的互斥锁来同步对共享数据的访问。或者,如果您愿意,可以使用C11原子整数

关于问题2:这也不安全。在某处使用互斥


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

谢谢!有道理。在阅读你的答案后,一定要把课程改好。谢谢!有道理。在阅读了你的答案后,你肯定需要修正课程。