go语言关于线程与通道channal
在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相关推荐
- 【C++ 语言】线程安全队列 ( 条件变量 | 线程调度 )
文章目录 I . 线程简单使用 II . 互斥锁 III . 条件变量 线程同步 IV . 完整代码示例 006_ThreadSafeQueue.h 006_ThreadSafeQueue.cpp S ...
- mysql 线程池源码模块_易语言Mysql线程池2.0模块源码
易语言Mysql线程池2.0模块源码 易语言Mysql线程池2.0模块源码 系统结构:GetThis,初始化,关闭类线程,线程_测试,其他_附加文本,连接池初始化,取mysql句柄,释放mysql句柄 ...
- 易语言启动线程传递多个类型的数据变量
易语言的启动线程默认是传递一个整数的,在 易语言启动线程传递文本参数中,我们讲解了传递文本参数,今天,我们示范传递多个变量 思路是我们把要传递的变量定义成一个整数型数组,传递的是参数内容的内存地址指针 ...
- c语言 线程读写,C语言创建线程以及使用锁进行读写分离
线程的使用 1.线程的创建 线程的相关操作放在中. 1.1我们定义一个线程,首先要进行定义一个函数,类似我们创建一个a线程 void *thread_a(void *in){ printf(" ...
- R语言绘制布林带通道
使用R语言绘制布林带通道. 其基本含义为: 所使用的公式为: 参数给个定值,看个具体的示例: 函数的语法格式: 显示布林带通道: 使用的函数addBBands的语法: 欢迎交流:
- c语言线程的创建步骤,C语言创建线程thread_create()的方法
在头文件 threads.h 中,定义和声明了支持多线程的宏.类型和函数.所有直接与线程相关的标识符,均以前缀 thrd_ 作为开头.例如,thrd_t 是一个对象类型,它标识了一个线程. 函数 th ...
- 关于C语言中线程同步的方式
C语言中线程同步的方式 线程同步 互斥锁 读写锁 条件变量 信号量 线程同步 在多线程环境中,线程之间由于竞争共享资源(临界资源)容易引起数据不一致的问题.一般采用互斥锁(互斥信号量)解决,保证只有一 ...
- Go语言无缓冲的通道
前沿 Go语言中无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道.这种类型的通道要求发送 goroutine 和接收 goroutine 同时准备好,才能完成发 ...
- Go 语言编程 — 并发 — Channel 通道
目录 文章目录 目录 Channel 通道缓冲区 遍历通道与关闭通道 Channel channel(通道)是用来传递数据的一个数据结构. 通道可用于两个 goroutine 之间通过传递一个指定类型 ...
- c语言停止线程,如何用C语言实现多线程
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Windows操作系统,C语言实现多线程: #include #include DWORD APIENTRY ThreadOne ( LPVOID thr ...
最新文章
- 让你完全理解base64是怎么回事
- ping 超时时间_华为交换机ping命令详解
- 彻底理解cookie、session、token
- 例说C#深拷贝与浅拷贝
- java自建ocr完整示例_Java 7:完整的invokedynamic示例
- 一个很不错的wp企业站模板
- 数据草拟:使您的团队热爱数据的研讨会
- 【SpringBoot】Spring boot 测试类 找到不到MySQL 驱动
- linux移动文件_Linux基础
- C++基础教程之数组
- vim编辑时遇到E325: ATTENTION Found a swap file by the name ./.backu.sh.swp错误代码的解决办法
- spring-beanFactory二
- mysql数据库两表建立联系_在MySQL数据库建立多对多的数据表关系
- matlab四元数傅里叶变换,四元数傅里叶变换
- 安装 ansible tower 报错:
- 微信 h5(公众号)简单登录
- 戴尔笔记本重装系统硬盘加密怎么解除
- 中国软件:10个人 20年坎坷路
- pyqt5 tablewidget 隐藏表头,设置表头
- xml 转 excel 和xml 转excel 的 思路描述
热门文章
- 原来小米手机电源键除了开关机,还隐藏这3大用法,真是厉害了
- Windows 10 按电源键只关屏幕不休眠的解决办法
- 怎么删除android系统自带软件,手机系统自带的那些软件不用却卸载不了,怎么办?...
- 罗老师算法竞赛专题解析
- 有效括号 python_1111. 有效括号的嵌套深度
- jQuery动画slideUp()不正常位移原因
- 程序员讨论《黑客帝国》(一)真实与虚拟
- 使用Photoshop出现提示“脚本错误-50出现一般Photoshop错误“
- 三点估算法评估开发工作量
- 亲生骨肉 窥视父母遗产 为了继承遗产竟用这种方式替代...