登录
首页 >  Golang >  Go问答

全局变量的管理和线程安全问题:CGO中的挑战

来源:stackoverflow

时间:2024-02-19 08:18:22 362浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《全局变量的管理和线程安全问题:CGO中的挑战》,很明显是关于Golang的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

问题内容

我试图弄清楚是否存在与 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 块中声明的全局变量来完成?

任何建议都会有帮助。谢谢!


解决方案


关于问题 1:不,这不安全。在 C 代码本身的某处使用互斥体(很可能是使用 POSIX 样式互斥体)来同步对共享数据的访问。或者,如果您愿意,可以使用 C11 原子整数。

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

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

今天关于《全局变量的管理和线程安全问题:CGO中的挑战》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>