gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:05:38 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com