golang中死锁的触发事件是什么
func main() {
var lock sync.Mutex
lock.Lock()
lock.Lock()
}
//报死锁错误
func main() {
var lock sync.RWMutex
lock.RLock()
lock.Lock()
}
//报死锁错误
func main() {
var lock sync.RWMutex
lock.RLock()
lock.RLock()
}
//正常执行
func main() {
var wg sync.WaitGroup
wg.Add(1)
wg.Wait()
//报死锁错误
}
package main
func main() {
select {
}
}
//报死锁错误
func main() {
var ch chan struct{}
ch <- struct{}{}
}
//报死锁错误
func main() {
ch := make(chan struct{})
<- ch
}
//报死锁错误
package main
func main() {
select {
}
}
func main() {
ch := make(chan struct{})
//ch <- struct{}{} //发送
<- ch //接受
fmt.Println("main over!")
}
package main
// 方式1
func recv(c chan int) {
ret := <-c
fmt.Println("接收成功", ret)
}
func main() {
ch := make(chan int)
go recv(ch) // 启用goroutine从通道接收值
ch <- 10
fmt.Println("发送成功")
}
// 方式2
func main() {
ch := make(chan int,1)
ch<-1
println(<-ch)
}
package main
import (
"fmt"
"time"
)
func request(index int,ch chan<- string) {
time.Sleep(time.Duration(index)*time.Second)
s := fmt.Sprintf("编号%d完成",index)
ch <- s
}
func main() {
ch := make(chan string, 10)
fmt.Println(ch,len(ch))
for i := 0; i < 4; i++ {
go request(i, ch)
}
for ret := range ch{ //当 ch 中没有数据的时候,for range ch 会发生阻塞,但是无法解除阻塞,发生死锁
fmt.Println(len(ch))
fmt.Println(ret)
}
}
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func request(index int,ch chan<- string) {
time.Sleep(time.Duration(index)*time.Second)
s := fmt.Sprintf("编号%d完成",index)
ch <- s
wg.Done()
}
func main() {
ch := make(chan string, 10)
for i := 0; i < 4; i++ {
wg.Add(1)
go request(i, ch)
}
go func() {
wg.Wait()
close(ch)
}()
LOOP:
for {
select {
case i,ok := <-ch: // select会一直等待,直到某个case的通信操作完成时,就会执行case分支对应的语句
if !ok {
break LOOP
}
println(i)
default:
time.Sleep(time.Second)
fmt.Println("无数据")
}
}
}
func main() {
ch := make(chan struct{}, 3)
for i := 0; i < 4; i++ {
ch <- struct{}{}
}
}
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func main() {
ch := make(chan struct{}, 3)
go func() {
for {
select {
case i, ok := <- ch:
wg.Done()
fmt.Println(i)
if !ok {
return
}
}
}
}()
for i := 0; i < 4; i++ {
wg.Add(1)
ch <- struct{}{}
}
wg.Wait()
}