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

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

觀察循環(huán)內(nèi)的無(wú)效值

觀察循環(huán)內(nèi)的無(wú)效值

Go
拉丁的傳說(shuō) 2023-07-17 14:19:41
我偶然發(fā)現(xiàn)了一個(gè)有缺陷的 Golang 代碼,該代碼試圖使用互斥體來(lái)防止對(duì) Goroutine 中打印的變量進(jìn)行更改:    runtime.GOMAXPROCS(1)    mutex := new(sync.Mutex)    for i := 0; i < 10; i++ {        for j := 0; j < 10; j++ {            mutex.Lock()            go func() {                fmt.Println(i, j, i + j);                mutex.Unlock()            }()        }    }我很清楚,互斥體不會(huì)直接鎖定,而是在下一次迭代中,當(dāng)值已經(jīng)增加時(shí)鎖定。不清楚的是,根據(jù)輸出,為什么 j 變量達(dá)到 10:...0 7 70 8 80 9 91 10 11   <--- isn't supposed to be here...1 9 102 10 12...我嘗試調(diào)試代碼,并j = 10在 i 的外循環(huán)增加其值時(shí)打印??雌饋?lái)好像外部循環(huán)正在釋放線程,允許 goroutine 執(zhí)行并看到無(wú)效值 10。有人可以澄清這種行為嗎?
查看完整描述

3 回答

?
郎朗坤

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

你有數(shù)據(jù)競(jìng)爭(zhēng)。結(jié)果未定義。


$ go run -race racer.go

==================

WARNING: DATA RACE

Read at 0x00c000016110 by goroutine 7:

? main.main.func1()

? ? ? /home/peter/gopath/racer.go:17 +0x7f


Previous write at 0x00c000016110 by main goroutine:

? main.main()

? ? ? /home/peter/gopath/racer.go:14 +0xf1


Goroutine 7 (running) created at:

? main.main()

? ? ? /home/peter/gopath/racer.go:16 +0xcd

==================

0 1 1

0 2 2

0 3 3

0 4 4

0 5 5

0 6 6

0 7 7

0 8 8

0 9 9

==================

WARNING: DATA RACE

Read at 0x00c000016108 by goroutine 16:

? main.main.func1()

? ? ? /home/peter/gopath/racer.go:17 +0x50


Previous write at 0x00c000016108 by main goroutine:

? main.main()

? ? ? /home/peter/gopath/racer.go:13 +0x140


Goroutine 16 (running) created at:

? main.main()

? ? ? /home/peter/gopath/racer.go:16 +0xcd

==================

1 10 11

1 1 2

1 2 3

1 3 4

1 4 5

1 5 6

1 6 7

1 7 8

1 8 9

1 9 10

2 10 12

2 1 3

2 2 4

2 3 5

2 4 6

2 5 7

2 6 8

2 7 9

2 8 10

2 9 11

3 10 13

3 1 4

3 2 5

3 3 6

3 4 7

3 5 8

3 6 9

3 7 10

3 8 11

3 9 12

4 10 14

4 1 5

4 2 6

4 3 7

4 4 8

4 5 9

4 6 10

4 7 11

4 8 12

4 9 13

5 10 15

5 1 6

5 2 7

5 3 8

5 4 9

5 5 10

5 6 11

5 7 12

5 8 13

5 9 14

6 10 16

6 1 7

6 2 8

6 3 9

6 4 10

6 5 11

6 6 12

6 7 13

6 8 14

6 9 15

7 10 17

7 1 8

7 2 9

7 3 10

7 4 11

7 5 12

7 6 13

7 7 14

7 8 15

7 9 16

8 10 18

8 1 9

8 2 10

8 3 11

8 4 12

8 5 13

8 6 14

8 7 15

8 8 16

8 9 17

9 10 19

9 1 10

9 2 11

9 3 12

9 4 13

9 5 14

9 6 15

9 7 16

9 8 17

9 9 18

Found 2 data race(s)

exit status 66

$?

racer.go:


package main


import (

? ? "fmt"

? ? "runtime"

? ? "sync"

)


func main() {

? ? runtime.GOMAXPROCS(1)


? ? mutex := new(sync.Mutex)

? ? for i := 0; i < 10; i++ {

? ? ? ? for j := 0; j < 10; j++ {

? ? ? ? ? ? mutex.Lock()

? ? ? ? ? ? go func() {

? ? ? ? ? ? ? ? fmt.Println(i, j, i+j)

? ? ? ? ? ? ? ? mutex.Unlock()

? ? ? ? ? ? }()

? ? ? ? }

? ? }

}


查看完整回答
反對(duì) 回復(fù) 2023-07-17
?
子衿沉夜

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

您存在數(shù)據(jù)競(jìng)爭(zhēng),因此結(jié)果未定義。運(yùn)行它并-race選擇查看。

當(dāng)您mutex.Lock()首先在循環(huán)體內(nèi)調(diào)用時(shí),不會(huì)阻塞。然后,您啟動(dòng)一個(gè) goroutine 來(lái)讀取ij,并且主 goroutine 繼續(xù)進(jìn)行內(nèi)循環(huán)的下一次迭代,并遞增j。然后再次調(diào)用lock,這將阻塞直到前一個(gè)goroutine完成。

但是您已經(jīng)對(duì)j.


查看完整回答
反對(duì) 回復(fù) 2023-07-17
?
繁星淼淼

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

讓我來(lái)回答為什么打印時(shí)可以得到不可能的j10 。


因?yàn)楫?dāng)你在循環(huán)中使用 goroutine 時(shí),fmt.Println(i, j, i+j)race with i++/j++,你無(wú)法確定打印時(shí)到底是什么值,而如果j增加到界限,有可能打印出 10。


如果你想阻止這場(chǎng)比賽,你可以將i,j作為參數(shù)值傳遞,例如


    runtime.GOMAXPROCS(1)


    for i := 0; i < 10; i++ {

        for j := 0; j < 10; j++ {

            go func(a, b, c int) {

                fmt.Println(a, b, c);

            }(i, j, i+j)

        }

    }

希望這可以幫助。


查看完整回答
反對(duì) 回復(fù) 2023-07-17
  • 3 回答
  • 0 關(guān)注
  • 183 瀏覽
慕課專欄
更多

添加回答

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