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

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

atomic.AddInt64 導(dǎo)致無(wú)效的內(nèi)存地址或 nil 指針取消引用

atomic.AddInt64 導(dǎo)致無(wú)效的內(nèi)存地址或 nil 指針取消引用

Go
繁華開(kāi)滿天機(jī) 2021-09-13 20:03:08
在 struct panics 的字段上調(diào)用 atomic.AddInt64 invalid memory address or nil pointer dereference,但在我們重新排列字段順序時(shí)不會(huì);為什么?使用這種類型:type CountHandler struct {    c     *RequestContext    count int64}并且調(diào)用atomic.AddInt64(&countHandler.count, 1)(此時(shí)字段c為零)恐慌。但當(dāng)我們將其重寫(xiě)為:type CountHandler struct {    count int64    c     *RequestContext}錯(cuò)誤消失。我想應(yīng)該是這樣,因?yàn)?Go 以順序方式將數(shù)據(jù)保存在內(nèi)存中,并且達(dá)到一個(gè)nil值會(huì)破壞這個(gè)(字節(jié))序列;但我想知道為什么又是這樣,因?yàn)橹羔槕?yīng)該具有固定大小nil或其他值。這是 Windows 上的 Go x86 1.4.2,完整的錯(cuò)誤消息是:2015/02/23 12:56:44 http: panic serving [::1]:51886: runtime error: invalid memory address or nil pointer dereferencegoroutine 5 [running]:net/http.func·011()        c:/go/src/net/http/server.go:1130 +0xa8sync/atomic.AddUint64(0x731144, 0x1, 0x0, 0x0, 0x263168)        c:/go/src/sync/atomic/asm_386.s:118 +0xcmain.(*CountHandler).ServeHTTP(0x731140, 0x263180, 0x122f6380, 0x122f62a0)        C:/Workshop/Devox/Workshop-Go/src/geoho/web/app/app.go:62 +0x42github.com/julienschmidt/httprouter.func·001(0x263180, 0x122f6380, 0x122f62a0, 0x0, 0x0, 0x0)        C:/Workshop/Devox/Workshop-Go/src/github.com/julienschmidt/httprouter/router.go:232 +0x4cgithub.com/julienschmidt/httprouter.(*Router).ServeHTTP(0x122d5d20, 0x263180, 0x122f6380, 0x122f62a0)        C:/Workshop/Devox/Workshop-Go/src/github.com/julienschmidt/httprouter/router.go:298 +0x141net/http.serverHandler.ServeHTTP(0x122d2280, 0x263180, 0x122f6380, 0x122f62a0)        c:/go/src/net/http/server.go:1703 +0x145net/http.(*conn).serve(0x122e01e0)        c:/go/src/net/http/server.go:1204 +0x9d8created by net/http.(*Server).Serve        c:/go/src/net/http/server.go:1751 +0x2ce
查看完整描述

2 回答

?
慕運(yùn)維8079593

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

在第一種情況下,錯(cuò)誤是由原子更新的字段沒(méi)有正確對(duì)齊引起的。

在 ARM 和 x86-32 上,調(diào)用者負(fù)責(zé)安排以原子方式訪問(wèn)的 64 位字的 64 位對(duì)齊。全局變量或分配的結(jié)構(gòu)體或切片中的第一個(gè)字可以依賴于 64 位對(duì)齊。


查看完整回答
反對(duì) 回復(fù) 2021-09-13
?
繁星淼淼

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

如果您偶然發(fā)現(xiàn)此錯(cuò)誤,這里有一些解決問(wèn)題的技巧:


如 OP 中所述,最簡(jiǎn)單的方法是將所有 64 位原子值放在結(jié)構(gòu)的頂部:


c := struct {

    val   int64 // pos 0

    val2  int64 // pos 8

    valid bool  // pos 16

}{val2: 1}

fmt.Println(atomic.AddInt64(&c.val2, 1))

如果您出于某種原因不想將此字段放在頂部,則始終可以_ [4]byte在 64 位字段上方放置 a以確保正確填充它。


c := struct {

    val   int64   // pos 0

    valid bool    // pos 8

    _     [4]byte // pos 9; compiler adds additional [3]byte at pos 13 for alignment

    val2  int64   // pos 16, correctly aligned

}{val2: 1}

fmt.Println(atomic.AddInt64(&c.val2, 1)) // => 2

請(qǐng)注意,如果字段已經(jīng)對(duì)齊,這將不起作用;相反,如果它之前沒(méi)有恐慌,它現(xiàn)在就會(huì)恐慌。


c := struct {

    val   int64   // pos 0

    _     [4]byte // pos 8; compiler adds no padding

    val2  int64   // pos 12, not a multiple of 8!

}{val2: 1}

fmt.Println(atomic.AddInt64(&c.val2, 1)) // => runtime error: invalid memory address [...]

您還可以依賴 64 位元素切片中的第一個(gè)元素將正確對(duì)齊的行為:


c := struct {

    val   int64

    valid bool

    val2  []int64

}{val2: []int64{1}}

fmt.Println(atomic.AddInt64(&c.val2[0], 1))

請(qǐng)注意,這不適用于數(shù)組,因?yàn)樗鼈兊闹抵苯哟鎯?chǔ)在結(jié)構(gòu)中,而不是像切片數(shù)據(jù)那樣存儲(chǔ)在堆中。


您可以使用的最后一個(gè)技巧是將結(jié)構(gòu)中的字段聲明為指向int64;的指針。如果int64它指向的是對(duì)齊的,那么它會(huì)順利運(yùn)行。


c := struct {

    val   int64

    valid bool

    val2  *int64

}{val2: new(int64)}

fmt.Println(atomic.AddInt64(c.val2, 1))

如果你不想弄臟你的手sync/atomic,請(qǐng)記住,這sync.Mutex是一個(gè)比處理原子更清晰、更容易理解的解決方案。


查看完整回答
反對(duì) 回復(fù) 2021-09-13
  • 2 回答
  • 0 關(guān)注
  • 348 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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