设为首页 加入收藏

TOP

GO 语言中 chan 的理解(一)
2023-07-23 13:25:05 】 浏览:70
Tags:chan

GO 语言中 chan 的理解

chan 的底层实现是怎么样的?

chan 是 Go 语言中的一个关键字,用于实现并发通信。chan 可以用于在不同的 goroutine 之间传递数据,实现数据的同步和异步传输。

在底层实现上,chan 是通过一个结构体来表示的,这个结构体包含了一个指向数据的指针和两个指向信道的指针。其中,一个指针用于发送数据,另一个指针用于接收数据。

下面是 chan 的底层实现代码:

type hchan struct {
    qcount   uint           // 当前队列中的元素数量
    dataqsiz uint           // 队列的容量
    buf      unsafe.Pointer // 指向队列的指针
    elemsize uint16         // 元素的大小
    closed   uint32         // 是否关闭
    elemtype *_type         // 元素的类型
    sendx    uint           // 发送的位置
    recvx    uint           // 接收的位置
    recvq    waitq          // 接收等待队列
    sendq    waitq          // 发送等待队列
    lock     mutex          // 锁
}

chan 的发送和接收操作的底现

当我们向 chan 发送数据时,会先检查 chan 是否已经关闭。如果 chan 已经关闭,那么发送操作会直接返回一个 panic。否则,会将数据复制到队列中,并更新发送位置。

下面是 chan 发送操作的底层实现代码:

func chansend(c *hchan, ep unsafe.Pointer, block bool) bool {
    // 检查 chan 是否已经关闭
    if c.closed != 0 {
        panic("send on closed channel")
    }
    // 计算发送位置
    i := c.sendx
    // 计算队列中的元素数量
    if c.qcount < c.dataqsiz {
        c.qcount++
    } else {
        // 如果队列已满,需要扩容
        grow(c)
    }
    // 更新发送位置
    c.sendx++
    // 将数据复制到队列中
    qput(c, i, ep)
    return true
}

当我们从 chan 接收数据时,也会先检查 chan 是否已经关闭。如果 chan 已经关闭并且队列中没有数据,那么接收操作会直接返回一个零值。否则,会从队列中取出数据,并更新接收位置。

下面是 chan 接收操作的底层实现代码:

func chanrecv(c *hchan, ep unsafe.Pointer, block bool) (selected, received bool) {
  &nbs
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Go 语言 context 都能做什么? 下一篇提升性能的利器:深入解析Section..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目