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 内存的指针。
我想弄清楚是否存在与 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 内存的指针。