Golang 支持LockOSThread()使当前的 goroutine 只绑定到当前的 OS 线程,它也可以UnlockOSThread()。
是否有任何用例可以从此功能中受益?
米琪卡哇伊
浏览 962回答 3
3回答
函数式编程
在 Go 线程模型中,对 C 代码、汇编代码或阻塞系统调用的调用发生在与调用 Go 代码相同的线程中,该线程由 Go 运行时调度程序管理。os.LockOSThread()当 Go 必须与一些外部库(例如 C 库)交互时,该机制非常有用。它保证对该库的多次连续调用将在同一线程中完成。这在几种情况下很有趣:许多图形库(OS X Cocoa、OpenGL、SDL 等)要求所有调用都在特定线程(或某些情况下的主线程)上完成。一些外部库基于线程本地存储(TLS) 设施。它们在附加到线程的数据结构中存储一些上下文。或者 API 的某些函数提供的结果的内存生命周期附加到线程。这个概念在 Windows 和类 Unix 系统中都有使用。一个典型的例子是 C 库中常用的 errno 全局变量,用于存储错误代码。在支持多线程的系统上,errno通常被定义为线程局部变量。更一般地,一些外部库可能使用线程标识符来索引/管理内部资源。