我试图找出与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/