Go 我们只能在没有volatile的情况下使用RWMutex?
在中,此程序不安全,如下所示,无法保证打印最新消息Go 我们只能在没有volatile的情况下使用RWMutex?,go,Go,在中,此程序不安全,如下所示,无法保证打印最新消息 type T struct { msg string } var g *T func setup() { t := new(T) t.msg = "hello, world" g = t } func main() { go setup() for g == nil { } print(g.msg) } 在JAVA中,volatile g也可以,我们必须使用rwmutex在
type T struct {
msg string
}
var g *T
func setup() {
t := new(T)
t.msg = "hello, world"
g = t
}
func main() {
go setup()
for g == nil {
}
print(g.msg)
}
在JAVA中,volatile g也可以,我们必须使用rwmutex在golang中继续打印最新的消息,如下所示
type T struct {
msg string
rwlock sync.RWMutex
}
var g = &T{}
func setup() {
g.rwlock.Lock()
defer g.rwlock.Unlock()
g.msg = "hello, world"
}
func main() {
go setup()
printMsg()
}
func printMsg() {
g.rwlock.RLock()
defer g.rwlock.RUnlock()
print(g.msg)
}
我认为如果你使用频道会更好
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)
}
T型结构{
味精串
doneC chan结构{}
}
func NewT()*T{
返回&T{
doneC:make(chan结构{},1),
}
}
函数(t*t)设置(){
t、 msg=“你好,世界”
t、 doneC以下是一些其他选项
忙等待。此程序在当前版本的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)
}