在go语言中,封装了多线程的使用方法,使其变得简单易用。

在这里说说自己一点体会,不正确的地方还是请各位大牛指正。

关于go语言的并发机制,这很简单,在你要执行的函数前面加上go即可

比如:

package main

import("fmt")
func main(){go fmt.Println("1")fmt.Println("2")    }

好了 这样即可使用,但是这个程序运行的时候会出问题,你会发现1打印不出来,为啥?

你问我为啥?

这是因为在执行这个的时候,你可以想像,程序优先执行主线程,这时会打印出2,然后程序就退出了,这个时候程序还没来及打印并发下的1,就退出了所以你看不到!!

那么怎么才能看到哪?

加个延时,等到线程把事情搞完才退出就能看到了,就像这样

package mainimport("fmt")
func main(){go fmt.Println("1")fmt.Println("2")
   time.Sleep(time.Second*1)
}

这样你就会发现,其实程序先打印2,在打印1,因为是主线程优先的,所以会出现这种状况(我猜的,管你信不信,好吧这是真的,你问谁都是这样给你说)

不管怎么说,我就问你这个多线程学起来简单不简单?你觉得是CreateThread()爽,还是这个爽!

下面说说通道channal

这个哪,你就可以理解成多线程之间通信的一个通道。

你问我怎么用这东西?

ch:=make (chan int)

chan是通道的关键字

make那就是创建的意思

int 那就是int类型的通道

简单不简单,开心不开心?

你开心的太早了,哈哈哈哈哈

上面仅仅是说了基本的用法,这里还有点东西需要在详细的说下,不然你还是不懂怎么用chan搞事情!

上面的

ch := make(chan int)

是创建一个无缓冲区的int类型的chan,具体什么叫无缓冲区,额,不知道怎么解释,以后再说吧

ch :=make(<-chan int)

这个是无缓冲区只读的ch

ch:=make(chan<- int)

无缓冲只写的 chan

关于"<-"符号,在go的多线程中会经常碰到,你需要知道一点这个是做什么用的

按照我的理解:

ch<-

这个意思是将数据写入ch

<-ch这个意思是将数据从ch中读出来

还是一个小例子说下相关的东西:

package main
import("fmt"//    "time"
)
func main(){ch:=make(chan int)ch<-1go func (){<-chfmt.Println("1")}()fmt.Println(":2")}

运行之后会告诉你,死锁了,为什么会出现?他是无缓冲区,也就是赋值必须要进去取值。不然就是死锁

package main
import("fmt"//    "time""time"
)
func main(){ch:=make(chan int,1)ch<-1go func (){v:=<-chfmt.Println(v)}()fmt.Println(":2")time.Sleep(time.Second*1)}

这样试试看哪

package mainimport(

"fmt"

//     "time" "time")func main(){

 ch:=make(chan int)

go func (){ v:=<-ch fmt.Println(v) }() ch<-1 fmt.Println(":2")

}

或者这样,后面这个是无缓冲区的,这样的话,ch在赋值的时候被阻塞,知道gofunc给取走,这样打印出来的结果就是1,2

生产消费者:

import (

    "fmt"
    "time"
)
func produce(p chan<- int) {
    for i := 0; i < 10; i++ {
        p <- i
        fmt.Println("send:", i)
    }
}
func consumer(c <-chan int) {
    for i := 0; i < 10; i++ {
        v := <-c
        fmt.Println("receive:", v)
    }
}
func main() {
    ch := make(chan int)
    go produce(ch)
    go consumer(ch)
    time.Sleep(1 * time.Second)
}

这个例子,我觉得能够体现的更明显,无缓冲区意味着这就是同步的,也就是说只能是ch写入,取出,写入,取出,写入,取出这样走,无缓冲区必须保证一个写入,另一个取出,才能执行下一次

再看看这个:

import (

    "fmt"
    "time"
)
func produce(p chan<- int) {
    for i := 0; i < 10; i++ {
        p <- i
        fmt.Println("send:", i)
    }
}
func consumer(c <-chan int) {
    for i := 0; i < 10; i++ {
        v := <-c
        fmt.Println("receive:", v)
    }
}
func main() {
    ch := make(chan int, 10)
    go produce(ch)
    go consumer(ch)
    time.Sleep(1 * time.Second)
}

再来看看这个,这个有缓冲区的,啥意思?

就是我有个容器,我可以一直往里面生产,知道这个被填满,也就是我可以一直往这个缓冲区塞东西,直到这10个被填满,我也可以一直读数据,也可以一下全部取出来。

大概就是这么意思。

参考文档:

http://studygolang.com/articles/3311

转载于:https://www.cnblogs.com/fudong071234/p/6759567.html

go语言关于线程与通道channal相关推荐

  1. 【C++ 语言】线程安全队列 ( 条件变量 | 线程调度 )

    文章目录 I . 线程简单使用 II . 互斥锁 III . 条件变量 线程同步 IV . 完整代码示例 006_ThreadSafeQueue.h 006_ThreadSafeQueue.cpp S ...

  2. mysql 线程池源码模块_易语言Mysql线程池2.0模块源码

    易语言Mysql线程池2.0模块源码 易语言Mysql线程池2.0模块源码 系统结构:GetThis,初始化,关闭类线程,线程_测试,其他_附加文本,连接池初始化,取mysql句柄,释放mysql句柄 ...

  3. 易语言启动线程传递多个类型的数据变量

    易语言的启动线程默认是传递一个整数的,在 易语言启动线程传递文本参数中,我们讲解了传递文本参数,今天,我们示范传递多个变量 思路是我们把要传递的变量定义成一个整数型数组,传递的是参数内容的内存地址指针 ...

  4. c语言 线程读写,C语言创建线程以及使用锁进行读写分离

    线程的使用 1.线程的创建 线程的相关操作放在中. 1.1我们定义一个线程,首先要进行定义一个函数,类似我们创建一个a线程 void *thread_a(void *in){ printf(" ...

  5. R语言绘制布林带通道

    使用R语言绘制布林带通道. 其基本含义为: 所使用的公式为: 参数给个定值,看个具体的示例: 函数的语法格式: 显示布林带通道: 使用的函数addBBands的语法: 欢迎交流:

  6. c语言线程的创建步骤,C语言创建线程thread_create()的方法

    在头文件 threads.h 中,定义和声明了支持多线程的宏.类型和函数.所有直接与线程相关的标识符,均以前缀 thrd_ 作为开头.例如,thrd_t 是一个对象类型,它标识了一个线程. 函数 th ...

  7. 关于C语言中线程同步的方式

    C语言中线程同步的方式 线程同步 互斥锁 读写锁 条件变量 信号量 线程同步 在多线程环境中,线程之间由于竞争共享资源(临界资源)容易引起数据不一致的问题.一般采用互斥锁(互斥信号量)解决,保证只有一 ...

  8. Go语言无缓冲的通道

    前沿 Go语言中无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道.这种类型的通道要求发送 goroutine 和接收 goroutine 同时准备好,才能完成发 ...

  9. Go 语言编程 — 并发 — Channel 通道

    目录 文章目录 目录 Channel 通道缓冲区 遍历通道与关闭通道 Channel channel(通道)是用来传递数据的一个数据结构. 通道可用于两个 goroutine 之间通过传递一个指定类型 ...

  10. c语言停止线程,如何用C语言实现多线程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Windows操作系统,C语言实现多线程: #include #include DWORD APIENTRY ThreadOne ( LPVOID thr ...

最新文章

  1. 让你完全理解base64是怎么回事
  2. ping 超时时间_华为交换机ping命令详解
  3. 彻底理解cookie、session、token
  4. 例说C#深拷贝与浅拷贝
  5. java自建ocr完整示例_Java 7:完整的invokedynamic示例
  6. 一个很不错的wp企业站模板
  7. 数据草拟:使您的团队热爱数据的研讨会
  8. 【SpringBoot】Spring boot 测试类 找到不到MySQL 驱动
  9. linux移动文件_Linux基础
  10. C++基础教程之数组
  11. vim编辑时遇到E325: ATTENTION Found a swap file by the name ./.backu.sh.swp错误代码的解决办法
  12. spring-beanFactory二
  13. mysql数据库两表建立联系_在MySQL数据库建立多对多的数据表关系
  14. matlab四元数傅里叶变换,四元数傅里叶变换
  15. 安装  ansible tower  报错:
  16. 微信 h5(公众号)简单登录
  17. 戴尔笔记本重装系统硬盘加密怎么解除
  18. 中国软件:10个人 20年坎坷路
  19. pyqt5 tablewidget 隐藏表头,设置表头
  20. xml 转 excel  和xml 转excel 的 思路描述

热门文章

  1. 原来小米手机电源键除了开关机,还隐藏这3大用法,真是厉害了
  2. Windows 10 按电源键只关屏幕不休眠的解决办法
  3. 怎么删除android系统自带软件,手机系统自带的那些软件不用却卸载不了,怎么办?...
  4. 罗老师算法竞赛专题解析
  5. 有效括号 python_1111. 有效括号的嵌套深度
  6. jQuery动画slideUp()不正常位移原因
  7. 程序员讨论《黑客帝国》(一)真实与虚拟
  8. 使用Photoshop出现提示“脚本错误-50出现一般Photoshop错误“
  9. 三点估算法评估开发工作量
  10. 亲生骨肉 窥视父母遗产 为了继承遗产竟用这种方式替代...