Cond - Primitiva de concurrencia de variable de condición

No hablemos de qué es este cond, comencemos desde una escena:

Hay una organización benéfica que necesita recaudar dinero y la meta es 1 millón, por ejemplo. Luego, se debe emitir un anuncio que indique que se debe recaudar 1 millón de donaciones. Las masas empezaron a donar dinero cuando vieron el anuncio. Todos tienen diferentes habilidades. Algunos pueden ser 10,000, algunos pueden ser 20,000, y algunas personas no creen que sea suficiente para donar. Para recaudar suficiente dinero más rápido, debe ser que cuanta más gente mejor, que en el mundo de la informática es utilizar todos los recursos de la CPU. Pronto, 1 millón será suficiente y la organización benéfica emitirá otro anuncio diciendo que el dinero es suficiente y que no todos necesitan donar. Entonces puede haber un retraso en la entrega de este mensaje. Si el dinero recibido es más de 1 millón, no hay manera. Puedes contar tanto como recibas. Siempre que puedas anunciarlo con sinceridad y usarlo correctamente.

Para abstraer la escena del llamamiento, el proceso de donar dinero en conjunto y publicitarlo después de llegar a 1 millón se puede realizar con Cond

func main() {
    
    
	c := sync.NewCond(&sync.Mutex{
    
    })
	var ready int //善款总额,单位万
	ctx, cancle := context.WithCancel(context.Background())
	for i := 0; i < runtime.NumCPU(); i++ {
    
     //尽可能多的人捐款,即充分利用cpu资源
		go func(i int) {
    
    
			for {
    
    
				select {
    
    
				case <-ctx.Done():
					log.Printf("已经100万了,那我[%v号选手]就不捐了", i)
					return
					//已经看到公告够了100万了,那就不捐了
				default:
					//想一下要捐多少
					time.Sleep(time.Duration(rand.Int63n(5)) * time.Second)
					// 加锁更改等待条件
					c.L.Lock()
					ad := rand.Intn(5)
					if ad == 0 {
    
    
						//准备捐一个空头账户,那不行,重新捐
						c.L.Unlock()
						break
					}
					ready += ad
					c.L.Unlock()
					log.Printf("[%v号选手]捐了%v万", i,ad)
					// 让慈善机构核对一下到100万了没
					c.Broadcast()
				}
			}
		}(i)
	}
	c.L.Lock()
	for ready < 100 {
    
    
		c.Wait()
		log.Printf("现在%v万", ready)
	}
	c.L.Unlock()
	log.Println("善款已经够一百万了,不用再捐了")
	cancle()
}

Esta primitiva de simultaneidad rara vez se usa. Puede conocer los escenarios de uso y cómo usarla. Para
una comprensión más profunda, consulte: Cond: Mecanismo de implementación de variable condicional y Guía para evitar trampas

Supongo que te gusta

Origin blog.csdn.net/csdniter/article/details/111043617
Recomendado
Clasificación