簡體   English   中英

CGO 塊中的全局變量 - memory 泄漏和 GO 中的線程安全

[英]Global variables in CGO block - memory leak and thread safety in GO

我試圖弄清楚是否存在與 CGO 塊中聲明的全局變量相關的線程安全和/或 memory 泄漏問題。 這是一些偽代碼:

/*    
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 中使用 singleton 模式時,我們“同步” init() 方法以確保只有一個人可以同時運行它。

問題 3. globalnum 和 globalchar 會自動進行垃圾回收嗎? 我注意到很多:推遲 C.free(unsafe.Pointer(somecpointer))。 這是否需要使用在 CGO 塊中聲明的全局變量來完成?

任何意見將是有益的。 謝謝!

關於問題 1:不,這不安全。 在 C 代碼本身的某個地方使用互斥鎖,很可能是使用 POSIX 風格的互斥鎖來同步對共享數據的訪問。 或者,如果您願意,可以使用 C11 原子 integer。

關於問題 2:這也不安全。 在某處使用互斥鎖。

再問3:全局C變量不需要GC。 一個不是指針,另一個是指向靜態持續時間的指針 C memory 持有 C 字符串文字do something (無論如何在init之后)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM