Go併發程式設計小測驗答案解析

2021-09-24 06:37:35 字數 3130 閱讀 3863

題目 colobu.com/2019/04/28/…

package main

import (

"fmt"

"sync"

)var mu sync.mutex

var chain string

func main

() func a

() func b

() func c

() 複製**

fatal error: all goroutines are asleep - deadlock! 引發panic mu未解鎖又上鎖引發死鎖

package main

import (

"fmt"

"sync"

"time"

)var mu sync.rwmutex

var count int

func main

() func a

() func b

() func c

() 複製**

fatal error: all goroutines are asleep - deadlock! 引發panic mu未解鎖又上鎖引發死鎖

因為go為了防止寫鎖飢餓,當有寫鎖等待時,後來的讀鎖獲取不了,會等待寫鎖完成後再獲取讀鎖。

package main

import (

"sync"

"time"

)func main

() ()

go func

() ()

wg.wait()

}複製**

panic: sync: waitgroup is reused before previous wait has returned

package doublecheck

import (

"sync"

)type once struct

func (o *once) do(f func())

o.m.lock()

defer o.m.unlock()

if o.done == 0

}複製**

可以編譯,有併發問題,f函式可能會被執行多次

o.done在多cpu執行下會有併發問題,可使用atomic包解決問題

package main

import (

"fmt"

"sync"

)type mymutex struct

func main

() 複製**

fatal error: all goroutines are asleep - deadlock! 死鎖

package main

import (

"bytes"

"fmt"

"runtime"

"sync"

"time"

)var pool = sync.pool }

func main

() }()

for i := 0; i < 1000; i++

}()} var stats runtime.memstats

for i := 0; ; i++

}func processrequest(size int)

複製**

可以編譯,執行時記憶體可能暴漲

package main

import (

"fmt"

"runtime"

"time"

)func main

() ()

go func(ch chan int) (ch)

c := time.tick(1 * time.second)

for range c

}複製**

一段時間後總是輸出 #goroutines: 2

package main

import "fmt"

func main

() ()

go func

() ()

<-ch

fmt.println(count)

}複製**

panic: close of nil channel

package main

import (

"fmt"

"sync"

)func main

() 複製**

不能編譯 沒有len()方法

package main

var c = make(chan int)

var a int

func f

() func main

() 複製**

輸出 1

package main

import "sync"

type map struct

func (m *map) get(key int) (int, bool)

func (m *map) put(key, value int)

func (m *map) len() int

func main

() go func

() wg.done()

}()go func

() wg.done()

}()wg.wait()

}複製**

可執行,有併發問題

package main

import (

"fmt"

"sync"

)func main

() wg.done()

}()go func

() wg.done()

}()wg.wait()

fmt.println(len(ints))

}複製**

輸出可能不是2000

Go 併發程式設計

go語言宣揚用通訊的方式共享資料。go語言以獨特的併發程式設計模型傲視群雄,與併發程式設計關係最緊密的 包就是sync包,意思是同步。同步的用途有兩個,乙個是避免多個執行緒在同一時刻操作同乙個資料塊,另乙個是協調多個執行緒,以避免它們在同一時刻執行同一塊 由於這一的資料庫和 塊的背後都隱含著一種或多...

go併發程式設計

x ch 從ch中接收值並賦值給變數x ch 從ch中接收值,忽略結果關閉 我們通過呼叫內建的close函式來關閉通道。close ch 關於關閉通道需要注意的事情是,只有在通知接收方goroutine所有的資料都傳送完畢的時候才需要關閉通道。通道是可以被垃圾 機制 的,它和關閉檔案是不一樣的,在結...

Go併發程式設計實踐

併發程式設計一直是golang區別與其他語言的很大優勢,也是實際工作場景中經常遇到的。近日筆者在組內分享了我們常見的併發場景,及 示例,以期望大家能在遇到相同場景下,能快速的想到解決方案,或者是拿這些方案與自己實現的比較,取長補短。現整理出來與大家共享。回到頂部 很多時候,我們只想併發的做一件事情,...