multithreading - Golang线程不是每次都执行
问题描述
所以,我正在测试 Golang。我了解 fmt.Println 不是线程安全的。所以,我尝试了sync.Mutex。以下是程序:
func threder(mux *Mutex, i int) {
mux.Lock()
fmt.Println("I am thread: ", i)
mux.Unlock()
return
}
func main() {
m := &Mutex{}
for i := 0; i < 300; i++ {
go threder(m, i)
}
}
我期待 300 行的输出。但是,我得到了 80-90 行。我哪里错了?
解决方案
当您main
返回时,所有其他线程都被杀死。当您main
在启动所有线程后立即返回时,其中一些线程无法打印。您可以使用sync.WaitGroup
等待所有线程停止:
func main() {
m := &sync.Mutex{}
var wg sync.WaitGroup
for i := 0; i < 300; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
threder(m, i)
}(i)
}
wg.Wait()
}
关于您的评论:如果您不将sync.Mutex
值作为指针传递,而是将值传递给sync.Mutex
将被复制的函数,并且每个副本将彼此独立运行。因此线程之间不会有同步,因为它们都使用自己的、独立的sync.Mutex
. 此外,您不得sync.Mutex
在第一次使用后复制 a,如文档中所述。这不会发生在您的情况下,因为您在使用 之前复制sync.Mutex
,但请注意它。
推荐阅读
- python - 如何将可调用对象定义到另一个python类中
- django - 多语言网站:如何在“静态”文本(编码到模板中)和数据库之间建立清晰的关系?
- node.js - 使用自定义项目环境变量类型减速扩展 @types/node
- r - 函数具有意外行为(dplyr 中的变异函数)
- reactjs - 无法将 redux 商店中可用的模拟数据用于 react-testing-library
- ionic3 - Ionic3 超级入门 ngx-translation 无法在 android 真实设备上运行
- jquery - 用于动态添加元素的 Jquery 分组事件侦听器
- java - 将输入流转换为 xlsx (Excel) 文件时如何防止换行符干扰
- javascript - 输入时是否可以使文本框垂直滚动?
- gstreamer - prelink-rtld:找不到命令