Golang 并发编程 之 runtime.LockOSThread
背景介绍
一些库(尤其是图形框架和库(例如Cocoa,OpenGL和libSDL))使用线程局部状态,并且可能要求仅从特定OS线程(通常是“主”线程)调用函数。 Go为此提供了runtime.LockOSThread函数,接下来通过示例说明如何正确使用它。
package dl
import (
"fmt"
"runtime"
)
// 安排main.main在主线程上运行
func init() {
runtime.LockOSThread()
}
// 在主线程main.main中调用Main循环
func Main() {
for f := range mainfunc {
// 取出工作队列中的函数进行调用
f()
}
}
var mainfunc = make(chan func())
func do(f func()) {
done := make(chan bool, 1)
// 将整个函数加入到工作队列中
mainfunc <- func() {
f()
fmt.Println("add queue")
done <- true
}
<-done
}
func Beep() {
do(func() {
// 无论什么时候都运行在主线程
fmt.Println("beep")
})
}
main包示例:
func main(){
go func() {
for {
dl.Beep()
}
}()
dl.Main()
}