老师,go语言函数内的局部变量是线程安全的么?

来源:11-5 传统同步机制

hehehei

2018-07-14

两个线程用同一个函数,函数内部的局部变量是线程安全的?我记得以前学c的多线程,函数内的变量会被调用函数的线程共享,导致多个线程对函数内局部变量竞争 。而我用go测试,好像多个线程并不会对函数内局部变量竞争,跑go race 也没有发现data race。难道go语言的函数不像c那样是存放在栈内共享的,每次执行的都是原声明函数的副本?

写回答

1回答

ccmouse

2018-07-16

函数的局部变量c语言和go语言一样的,都是每次执行有自己的副本。你之前一定是理解有误。

很可能之前说到的是指针类型的变量。在多线程环境里每个局部的指针类型变量,虽然都是不同的副本,但是如果都指向同一块内存,那么就会有data race,c语言和go语言也一样,都会有。

这里可以参考我之前说到指针变量,以及函数参数的传递。

0
1
hehehei
谢谢老师,试了一下,确实是,每个线程局部变量的地址都不一样。问题偏了,php这种脚本语言写多了,基础知识不扎实
2018-07-18
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程