作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Go中的以下测试失败:
type A struct {
b bool
}
func TestWG(t *testing.T) {
var wg sync.WaitGroup
a := update(&wg)
wg.Wait()
if !a.b {
t.Errorf("error")
}
}
// Does not work
func update(group *sync.WaitGroup) A {
a := A{
b : false,
}
group.Add(1)
go func() {
a.b = true
group.Done()
}()
return a
}
最初,我认为这可能是由于
waitGroup.Done()
中没有障碍而发生的,这可能解释了为什么将
update
更改为
// works
func update(group *sync.WaitGroup) A {
a := A{
b : false,
}
group.Add(1)
go func() {
a.b = true
group.Done()
}()
time.Sleep(1*time.Second)
return a
}
作品。但是然后将返回类型更改为
pointer
也可以使它工作
// works
func update(group *sync.WaitGroup) *A {
a := A{
b : false,
}
group.Add(1)
go func() {
a.b = true
group.Done()
}()
return &a
}
有人可以告诉我这里发生了什么吗?
最佳答案
您的第一个示例涉及数据竞赛!
您返回需要读取的a
,并发goroutine(您刚刚启动的)会在不同步的情况下写入它。因此输出未定义! go test -race
也证实了这一点。
添加 sleep 时也会发生同样的事情:数据争用仍然存在( time.Sleep()
是而不是同步工具),因此结果仍然不确定! go test -race
再次确认这一点。
当您将返回类型更改为指针时,您只需返回一个指向a
的指针,而该指针不涉及读取a
的值,并且启动的goroutine不会修改指针,而只是修改指向的值。并且调用方TestWG()
正确地等待,直到使用waitgroup完成操作为止,因此此处没有发生数据争用。
关于go - 跨例程共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64264828/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!