chan的阻塞和非阻塞?
题目来源:京东
答案:
管道(chan)是Go在语言层面提供的协程间通信机制,比UNIX管道更易用也更轻便。chan可以使用内置函数make()创建无缓冲管道和带缓冲管道。
管道无缓冲区时,从管道读取数据会阻塞,直到有协程向管道写入数据。类似地,向管道写入数据也会阻塞,直到有协程从管道读取数据。
管道有缓冲区但缓冲区没有数据时,从管道读取数据也会阻塞,直到有协程写入数据。类似地,向管道写入数据时,如果缓冲区已满,那么也会阻塞,直到有协程从缓冲区中读出数据。
对于值为nil的管道,无论读写都会阻塞,而且是永久阻塞。
小结:
协程读取管道时,阻塞的条件有:
管道无缓冲区
管道缓冲区中无数据
管道的值为nil
协程写入管道时,阻塞的条件有:
管道无缓冲区
管道的缓冲区已满
管道的值为nil