zoukankan      html  css  js  c++  java
  • [GO]channel实现同步

    goroutine运行在相同的地址空间,因此访问共享内存必须 做好同步。goroutine奉行通过通信来共享内存,而不是共享内存通信

    它跟map一样,使用make来创建,它是一个引用 ,而不是值传递

    make(chan Type, capacity)

    channel <- value //发送value到channel

    <- channel  //接收并将其丢弃

    x := <-channel  //从channel中接收数据,并赋值给x

    x, ok := <-channel //功能同上,同时检查通道是否已关闭或者是否为空

    package main
    
    import (
        "fmt"
        //"time"
    )
    
    var ch = make(chan int)
    
    func Printer(s string)  {
        for _, data := range s {
            //fmt.Println(string(data))
            fmt.Printf("%c", data)
            //time.Sleep(time.Second)
        }
    }
    //person1执行完成后才能到person2执行
    func person1()  {
        Printer("hello")
        ch <- 666//给管道定数据,发送,放在了打印的后面
    }
    
    func person2()  {
        <- ch //从管道取数据,接收 ,如果通道没有数据他就会阻塞,放在了打印的前面
        Printer("world")
    }
    
    func main() {
        go person1()
        go person2()
        for true {
        }
    }

    先看执行的结果

    helloworld

    如何实现的?

    首先需要知道的是person1和person2的子协程几乎是同时执行的,但是,因为person2在打印之前有一个管道的处理,而与几乎同时,person1已经在执行print语句了,执行完print语句后又向管道存了值

    person2中的管道语句一看管道来值了,也就继续执行了后面的print语句,这样才实现了上面的结果

  • 相关阅读:
    用 C# 获取 IE 临时文件(转)
    vs2008打包程序需要.net3.5支持问题的解决方案
    关于使用ssh账号上外网
    元数据管理技术及发展应用现状
    一个拨号上网的批处理文件
    windows下启动和关闭oracle数据库的bat脚本
    Solaris下配置网络
    开启windows 2000 server上的远程桌面
    FileZilla客户端使用TIPs
    学习使用gvim
  • 原文地址:https://www.cnblogs.com/baylorqu/p/9672786.html
Copyright © 2011-2022 走看看