Golang支持LockOSThread()将当前的goroutine专门绑定到当前的OS线程,它也可以UnlockOSThread().
是否有任何用例受益于此功能?
Did*_*zia 20
使用Go线程模型,对C代码,汇编代码或阻塞系统调用的调用发生在与调用Go代码相同的线程中,该代码由Go运行时调度程序管理.
os.LockOSThread()当Go必须与某些外部库(例如C库)接口时,该机制非常有用.它保证在同一个线程中对该库进行多次连续调用.
这在几种情况下很有趣:
许多图形库(OS X Cocoa,OpenGL,SDL,...)要求所有调用都在特定线程(或某些情况下的主线程)上完成.
一些外国库基于线程本地存储(TLS)工具.它们将一些上下文存储在附加到线程的数据结构中.或者API的某些功能提供其内存生命周期附加到线程的结果.这个概念用于Windows和类Unix系统.典型示例是C库中常用于存储错误代码的errno全局变量.在支持多线程的系统上,errno通常被定义为线程局部变量.
更一般地,一些外国库可以使用线程标识符来索引/管理内部资源.
runtime.LockOsThread通常用于调用需要在主线程中运行的 C 代码,例如在图形库中。
转到有关 LockOsThread 的 Wiki页面以及有关如何使用它的示例。
Google就 SDL 中 LockOsThread 的使用进行了分组讨论。
正如这里提到的,它的runtime.LockOSThread作用是防止任何其他 goroutine 在同一线程上运行。
但请注意,Go 1.10(2018 年第一季度)将稍微改变其用法:
LockOSThread由于和的一种常见用途UnlockOSThread是允许 Go 代码可靠地修改线程本地状态(例如,Linux 或 Plan 9 名称空间),因此运行时现在将锁定的线程视为不适合重用或创建新线程。
LockOSThread嵌套调用和的行为UnlockOSThread已更改。这些函数控制一个goroutine是否被锁定到特定的操作系统线程,使得该goroutine只在该线程上运行,并且该线程也只运行该goroutine。
LockOSThread以前,连续调用多次就相当于调用一次,并且一次UnlockOSThread总是解锁线程。现在,调用嵌套:如果
LockOSThread被多次调用,UnlockOSThread则必须调用相同的次数才能解锁线程。