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

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

TCP `net.Conn.Read` 在使用`encoding/gob` 解碼器后掛起

TCP `net.Conn.Read` 在使用`encoding/gob` 解碼器后掛起

Go
慕尼黑8549860 2022-01-10 17:26:26
我可以net.Conn用encoding/goben/decoder包裝 TCP 的末端并通過(guò)它成功地 en/decode 一個(gè)值,但是如果我在原始連接上Decode使用 a Read,它會(huì)掛在Read:package mainimport (    "encoding/gob"    "net"    "log"    "sync")func main() {    var wg sync.WaitGroup    addr := &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 9000}    ready := make(chan struct{})    wg.Add(1)    go func() {        defer wg.Done()        ln, err := net.ListenTCP("tcp4", addr)        if err != nil {            log.Fatal("ln: ", err)        }        defer ln.Close()        close(ready)        conn, err := ln.Accept()        if err != nil {            log.Fatal("conn: ", err)        }        defer conn.Close()        var out string        if err := gob.NewDecoder(conn).Decode(&out); err != nil {            log.Fatal("error decoding: ", err)        }        if "hello" != out {            log.Fatalf("1 expected '%s', got '%s'", "hello", out)        }        b := make([]byte, 1)        log.Println("ready to read 1")        if _, err := conn.Read(b); err != nil {            log.Fatal("error reading: ", err)        }        log.Println("read 1")        if b[0] != 1 {            log.Fatalf("2 expected '%d', got '%d'", 1, b[0])        }        if _, err := conn.Write([]byte{1}); err != nil {            log.Fatal("err writing2: ", err)        }        log.Println("done 1")    }()    wg.Add(1)    go func() {        defer wg.Done()        <-ready        conn, err := net.DialTCP("tcp4", nil, addr)        if err != nil {            log.Fatal("conn2: ", err)        }}輸出:2009/11/10 23:00:00 waiting2009/11/10 23:00:00 ready to read 22009/11/10 23:00:00 ready to read 1這會(huì)在 Go Playground 中導(dǎo)致死鎖恐慌并掛在我的本地機(jī)器上 ( go version go1.6.2 darwin/amd64),盡管代碼會(huì)間歇性地在本地執(zhí)行到完成。如果我使用 anet.PipeConn或者如果我Decode使用 aWrite來(lái)代替(即在 en/decode 之后交換Read/的順序),則不會(huì)發(fā)生這種情況Write。當(dāng)我刪除 en/decode 代碼時(shí),en/decode 之后的代碼也可以單獨(dú)工作。是什么導(dǎo)致了這個(gè)掛起?這感覺(jué)像是一個(gè)緩存問(wèn)題,但我不知道為什么Write不會(huì)刷新或?yàn)槭裁碦ead不會(huì)提取最新的可用數(shù)據(jù),或者為什么這個(gè)問(wèn)題只在gob涉及編碼/解碼時(shí)出現(xiàn)。
查看完整描述

1 回答

?
三國(guó)紛爭(zhēng)

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

gobbufio.Reader如果讀者還不是 bufio,則將讀者包裝在 a 中,您確實(shí)有 2 個(gè)選項(xiàng):

  1. 將您的 conn 包裝在 bufio.Reader 中并將其傳遞給 gob 并從那時(shí)起使用它。

  2. 對(duì)所有東西都使用 gob,不要手動(dòng)讀/寫。


查看完整回答
反對(duì) 回復(fù) 2022-01-10
  • 1 回答
  • 0 關(guān)注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報(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)