第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在 Go 中分配指針是原子的嗎?

在 Go 中分配指針是原子的嗎?

Go
慕尼黑8549860 2021-07-05 12:14:50
在 Go 中分配指針是原子的嗎?我需要在鎖中分配一個(gè)指針嗎?假設(shè)我只想將指針分配給 nil,并希望其他線程能夠看到它。我知道在 Java 中我們可以為此使用 volatile,但在 Go 中沒有 volatile。
查看完整描述

3 回答

?
翻過高山走不出你

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊

在 go 中唯一保證原子性的是sync.atomic中的操作。


因此,如果您想確定您要么需要鎖定,例如sync.Mutex,要么使用原子原語之一。我不建議使用原子原語,因?yàn)槟惚仨氃谌魏问褂弥羔樀牡胤绞褂盟鼈?,而且它們很難正確使用。


使用互斥鎖是可以的 - 您可以定義一個(gè)函數(shù)來非常容易地通過鎖定返回當(dāng)前指針,例如類似的東西


import "sync"


var secretPointer *int

var pointerLock sync.Mutex


func CurrentPointer() *int {

    pointerLock.Lock()

    defer pointerLock.Unlock()

    return secretPointer

}


func SetPointer(p *int) {

    pointerLock.Lock()

    secretPointer = p

    pointerLock.Unlock()

}

這些函數(shù)將指針的副本返回給它們的客戶端,即使主指針更改,該副本也將保持不變。這可能會(huì)也可能不可接受,具體取決于您的要求的時(shí)間緊迫程度。這應(yīng)該足以避免任何未定義的行為——垃圾收集器將確保指針始終保持有效,即使您的程序不再使用所指向的內(nèi)存。


另一種方法是只從一個(gè) go 例程進(jìn)行指針訪問,并使用通道命令 go 例程執(zhí)行某些操作。這將被認(rèn)為是更慣用的 go,但可能不完全適合您的應(yīng)用程序。


更新


這是一個(gè)示例,展示了如何使用atomic.SetPointer. 由于使用了unsafe.Pointer. 然而,unsafe.Pointer強(qiáng)制轉(zhuǎn)換編譯為空,因此運(yùn)行時(shí)成本很小。


import (

    "fmt"

    "sync/atomic"

    "unsafe"

)


type Struct struct {

    p unsafe.Pointer // some pointer

}


func main() {

    data := 1


    info := Struct{p: unsafe.Pointer(&data)}


    fmt.Printf("info is %d\n", *(*int)(info.p))


    otherData := 2


    atomic.StorePointer(&info.p, unsafe.Pointer(&otherData))


    fmt.Printf("info is %d\n", *(*int)(info.p))


}


查看完整回答
反對 回復(fù) 2021-07-19
?
MYYA

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊

由于規(guī)范沒有指定,你應(yīng)該假設(shè)它不是。即使它目前是原子的,它也有可能在不違反規(guī)范的情況下進(jìn)行更改。


查看完整回答
反對 回復(fù) 2021-07-19
?
叮當(dāng)貓咪

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊

除了尼克的回答之外,從 Go 1.4 開始,還有atomic.Value類型。它Store(interface)和Load() interface方法負(fù)責(zé)unsafe.Pointer轉(zhuǎn)換。


簡單的例子:


package main


import (

    "sync/atomic"

)


type stats struct{}


type myType struct {

    stats atomic.Value

}


func main() {

    var t myType

    

    s := new(stats)

    

    t.stats.Store(s)

    

    s = t.stats.Load().(*stats)

}

或者來自Go playground文檔的更擴(kuò)展示例。


查看完整回答
反對 回復(fù) 2021-07-19
  • 3 回答
  • 0 關(guān)注
  • 388 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)