题目
利用container/list实现一个在多线程下并发安全的队列,队列长度为5。队列满时,阻塞存储元素的线程,直到队列可用;队列空时,获取元素的线程会等待队列非空。
package main
import (
"container/list"
"fmt"
"math/rand"
"sync"
"time"
)
var (
lock sync.Mutex
empty *sync.Cond
full *sync.Cond
l *list.List
)
func main() {
lock = sync.Mutex{}
empty = sync.NewCond(&lock)
full = sync.NewCond(&lock)
l = list.New()
go func() {
for i := 0; i < 20; i++ {
// 休眠一段时间
random := rand.Int63n(20)
time.Sleep(time.Duration(random) * time.Millisecond)
push(i)
}
}()
go func() {
for j := 0; j < 20; j++ {
// 休眠一段时间
random := rand.Int63n(30)
time.Sleep(time.Duration(random) * time.Millisecond)
take()
}
}()
time.Sleep(1 * time.Second)
}
func push(i int) {
defer lock.Unlock()
lock.Lock()
for l.Len() >= 5 {
fmt.Println("push full wait...........................")
full.Wait()
}
l.PushBack(i)
empty.Signal()
}
func take() {
defer lock.Unlock()
lock.Lock()
for l.Len() <= 0 {
fmt.Println("take empty wait...........................")
empty.Wait()
}
e := l.Front()
l.Remove(e)
fmt.Println(e.Value)
full.Signal()
}