我试图弄清楚是否存在与 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 块中声明的全局变量来完成?
任何意见将是有益的。谢谢!
泛舟湖上清波郎朗
相关分类