亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我們只能使用RWMutex而不使用易失性嗎?

我們只能使用RWMutex而不使用易失性嗎?

Go
回首憶惘然 2023-07-26 15:36:00
在https://golang.org/ref/mem#tmp_10中,該程序并不安全,如下所示,無法保證打印最新的消息type T struct {    msg string}var g *Tfunc setup() {    t := new(T)    t.msg = "hello, world"    g = t}func main() {    go setup()    for g == nil {    }    print(g.msg)}在JAVA中,對于易失性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)}
查看完整描述

2 回答

?
牧羊人nacy

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)

}


查看完整回答
反對 回復 2023-07-26
?
千巷貓影

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)

}


查看完整回答
反對 回復 2023-07-26
  • 2 回答
  • 0 關注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號