Я пытаюсь выяснить, существует ли проблема безопасности потоков и / или утечки памяти, связанная с глобальными переменными, объявленными в блоке 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())
}
gopro c () вызывается в нескольких потоках.
Вопрос 1. Является ли globalnum потокобезопасным? Могут ли им управлять одновременно разные потоки?
Вопрос 2. Есть ли какие-либо возможные проблемы, связанные с выполнением init () в этом шаблоне только один раз? Когда в Java используется одноэлементный шаблон, мы «синхронизируем» метод init (), чтобы убедиться, что только один человек может запустить его одновременно.
Вопрос 3. Будут ли globalnum и globalchar автоматически собирать мусор? Я заметил много: defer C .free (unsafe.Pointer (somecpointer)). Нужно ли это делать с глобальными переменными, объявленными в блоке CGO?
Любые советы были бы полезны. Спасибо!