Thinking_Out_Loud

《Go程序设计语言》读书笔记#8

2018-10-18

第九章 使用共享变量实现并发

< P262 >

  • 可以用容量为1的channel实现互斥锁;
  • 通常互斥锁的声明紧贴在要守卫的变量前,如果偏离这个原则,应该在文档中说明;
  • 如果返回的变量需要互斥锁,可以使用defer解锁;

< P266 >

  • sync.RWMutex只有在多数是读取的情况下才更有效,因为RWMutex的实现要求更多内部标记,当用作非争用锁时可能比常规的更慢;
  • 只读的变量也应该互斥;第一是防止在其它操作的中间步骤读取,第二是防止多核情况下,处理器没有将cache提交到主内存;

< P271 >

go buildgo test后加上选项-race可以检测运行中出现的data race

< P280 >

  • goroutine的栈可以增长,一般初始大小是2KB;
  • Go使用m:n scheduling,m指goroutine数,n指系统线程数;
  • goroutinetime.Sleepchannel阻塞或互斥锁时会被scheduler置入休眠态,即不占用系统线程,但是如果是IO阻塞或者调用非Go函数则占用且其线程数不纳入GOMAXPROCS
  • 环境变量GOMAXPROCS指m:n中的n,默认值是cpu数;
  • goroutine没有供编程人员使用的标识;