2 回答
TA贡献1862条经验 获得超7个赞
这里还有一些其他选项。
忙着等。该程序在当前版本的 Go 中完成,但规范不保证它。 在操场上运行它。
package main
import (
"runtime"
"sync/atomic"
"unsafe"
)
type T struct {
msg string
}
var g unsafe.Pointer
func setup() {
t := new(T)
t.msg = "hello, world"
atomic.StorePointer(&g, unsafe.Pointer(t))
}
func main() {
go setup()
var t *T
for {
runtime.Gosched()
t = (*T)(atomic.LoadPointer(&g))
if t != nil {
break
}
}
print(t.msg)
}
渠道。在操场上运行它。
func setup(ch chan struct{}) {
t := new(T)
t.msg = "hello, world"
g = t
close(ch) // signal that the value is set
}
func main() {
var ch = make(chan struct{})
go setup(ch)
<-ch // wait for the value to be set.
print(g.msg)
}
var g *T
func setup(wg *sync.WaitGroup) {
t := new(T)
t.msg = "hello, world"
g = t
wg.Done()
}
func main() {
var wg sync.WaitGroup
wg.Add(1)
go setup(&wg)
wg.Wait()
print(g.msg)
}
TA贡献1829条经验 获得超7个赞
我认为使用渠道会更好。
type T struct {
msg string
doneC chan struct{}
}
func NewT() *T {
return &T{
doneC: make(chan struct{}, 1),
}
}
func (t *T) setup() {
t.msg = "hello, world"
t.doneC <- struct{}{}
}
func main() {
t := NewT()
go t.setup()
<- t.doneC // or use select to set a timeout
fmt.Println(t.msg)
}
- 2 回答
- 0 关注
- 89 浏览
添加回答
举报