使用goroutine和channel写一个信号量

使用channel在多个goroutine间通信例子:

func write(intChan chan int, exitChan chan bool) {
	for i := 0; i < 10; i++ {
		intChan <- i
	}
	exitChan <- true
	close(intChan)
}
 
func read(intChan chan int, exitChan chan bool) {
	for {
		i, ok := <-intChan
		if !ok {
			break
		}
		fmt.Println(i)
	}
	exitChan <- true
}
 
func main() {
	intChan := make(chan int, 10)
	exitChan := make(chan bool, 2)  //用来控制协程退出
	go write(intChan, exitChan)
	go read(intChan, exitChan)
	for i := 0; i < 2; i++ {
		<-exitChan    //如果write或者read其中任一没有执行完,exitchan将阻塞
	}
}

 

使用goroutine和channel写一个信号量:

package mypkg3

import "fmt"

// Semaphore 信号量
type Semaphore struct {
	pool chan bool   
}

func (s *Semaphore) acquire() {
	s.pool <- true

}
func (s *Semaphore) release() {
	<-s.pool
}

// NewSemaphore 创建信号量
func NewSemaphore(n int) *Semaphore {
	return &Semaphore{make(chan bool, n)}
}

var sem *Semaphore

func task(index int){ 
	sem.acquire()   //请求一个资源,当信号量剩余缓存为0时,此请求将被阻塞
	fmt.Println(index)
}
func Print_name(){
	n:=8
	sem = NewSemaphore(n)//创建缓存容量=n的信号量
	for i:=0;i

 

你可能感兴趣的:(golang)