Golang中的runtime.LockOSThread的好处

Jas*_* Xu 17 go

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通常被定义为线程局部变量.

  • 更一般地,一些外国库可以使用线程标识符来索引/管理内部资源.


Mar*_*arc 6

runtime.LockOsThread通常用于调用需要在主线程中运行的 C 代码,例如在图形库中。

转到有关 LockOsThread 的 Wiki页面以及有关如何使用它的示例。

Google就 SDL 中 LockOsThread 的使用进行了分组讨论。


Von*_*onC 5

正如这里提到的,它的runtime.LockOSThread作用是防止任何其他 goroutine 在同一线程上运行。
但请注意,Go 1.10(2018 年第一季度)将稍微改变其用法:

LockOSThread由于和的一种常见用途UnlockOSThread是允许 Go 代码可靠地修改线程本地状态(例如,Linux 或 Plan 9 名称空间),因此运行时现在将锁定的线程视为不适合重用或创建新线程。

LockOSThread嵌套调用和的行为UnlockOSThread已更改。这些函数控制一个goroutine是否被锁定到特定的操作系统线程,使得该goroutine只在该线程上运行,并且该线程也只运行该goroutine。

LockOSThread以前,连续调用多次就相当于调用一次,并且一次UnlockOSThread总是解锁线程。

现在,调用嵌套:如果LockOSThread被多次调用,UnlockOSThread则必须调用相同的次数才能解锁线程。