zoukankan      html  css  js  c++  java
  • Go Example--状态协程

    package main
    
    import (
    	"fmt"
    	"math/rand"
    	"sync/atomic"
    	"time"
    )
    
    type readOp struct {
    	key  int
    	resp chan int
    }
    type writeOp struct {
    	key  int
    	val  int
    	resp chan bool
    }
    
    func main() {
    	var ops int64
    	reads := make(chan *readOp)
    	writes := make(chan *writeOp)
    	go func() {
    		//在该协程中定义的map,通过其他协程来读取数据,因为map不是协程安全的,所以只能一个协程来读取
    		var state = make(map[int]int)
    		for {
    			select {
    			case read := <-reads:
    				read.resp <- state[read.key]
    			case write := <-writes:
    				write.resp <- true
    			}
    		}
    	}()
    	for r := 0; r < 100; r++ {
    		go func() {
    			for {
    				read := &readOp{
    					key:  rand.Intn(5),
    					resp: make(chan int),
    				}
    				reads <- read
    				<-read.resp
    				atomic.AddInt64(&ops, 1)
    			}
    		}()
    	}
    	for w := 0; w < 10; w++ {
    		go func() {
    			for {
    				write := &writeOp{
    					key:  rand.Intn(5),
    					val:  rand.Intn(100),
    					resp: make(chan bool),
    				}
    				writes <- write
    				<-write.resp
    				atomic.AddInt64(&ops, 1)
    			}
    		}()
    	}
    	time.Sleep(time.Second)
    	opsFinal := atomic.LoadInt64(&ops)
    	fmt.Println("ops:", opsFinal)
    }
    
  • 相关阅读:
    Effective C++:条款14:在中小企业资源管理copying表现
    Linux在iptables教程基本应用防火墙
    C++内存分配和拷贝构造函数写研究
    Codeforces 479E Riding in a Lift(dp)
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
  • 原文地址:https://www.cnblogs.com/promenader/p/9837013.html
Copyright © 2011-2022 走看看