有没有办法确保 goroutine 只在特定的 OS 线程中运行?例如,当 GUI 操作必须在 GUI 线程中运行,但可能有多个 goroutines 运行 GUI 代码时。
GOMAXPROCS(1)
在技术上完成这项工作,但这违背了多线程的目的。
LockOSThread()
也可以,但这也阻止了任何其他 goroutine 在该线程中运行。
有没有办法做到这一点,或者需要同一个线程的所有东西都必须在同一个 goroutine 中运行?
据我所知,目前没有。我认为这样做的“go-like”方式是编写一个在 GUI 线程中运行的 Goroutine,并为来自其他 goroutine 通过通道发送的请求提供服务。例如,您可以让它从接受函数指针的通道中读取,并执行这些函数。
你为什么要这样做?runtime.LockOSThread()
如果您从使用线程本地存储的 C 代码创建库绑定,我认为这是必要的。否则,只需让调度程序为您多路复用 goroutine。
请注意,runtime.LockOSThread()
只有在您调用runtime.UnlockOSThread()
.