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

标签 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) {
    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是否会自动收集垃圾?我注意到很多:延迟C.free(unsafe.Pointer(somecpointer))。是否需要使用CGO块中声明的全局变量来完成此操作?

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

最佳答案

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

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

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

关于c - CGO block 中的全局变量-GO中的内存泄漏和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62032524/

相关文章:

c - 快速向后翻转一大块内存

c - 为什么我的评估在 C 中无法正确显示?

html - 输入按钮的光标将无法设置为指针

c++ - C/C++ 指针技巧修复

go - 使用 json key 文件从 golang 登录到 bigquery

连续两次执行 os/exec Command.Start()

JSON Unmarshal 预期响应和错误消息

c - memset上的程序崩溃?

c++ - 错误 C2440 : 'initializing' : cannot convert from 'const int' to 'int *'

c - 如何处理 argv 字符数组赋值?