Golang支持LockOSThread()
使当前的goroutine专门绑定到当前的OS线程,它也可以UnlockOSThread()
。
是否有任何用例受益于此功能?
使用Go线程模型,对C代码,汇编代码或阻塞系统调用的调用发生在与调用Go代码相同的线程中,该代码由Go运行时调度程序管理。
当Go必须与一些外部库(例如C库)接口时,os.LockOSThread()
机制非常有用。它保证在同一个线程中对该库进行多次连续调用。
这在几种情况下很有趣:
runtime.LockOsThread它通常用于调用需要在主线程中运行的C代码,就像在图形库中一样。
关于LockOsThread的Wiki page以及如何使用它的示例。
谷歌组织discussion关于在SDL中使用LockOsThread。
作为mentioned here,runtime.LockOSThread
所做的是阻止任何其他goroutine在同一个线程上运行。
但请注意,Go 1.10 (Q1 2018)将改变其用法:
因为
LockOSThread
和UnlockOSThread
的一个常见用途是允许Go代码可靠地修改线程本地状态(例如,Linux或Plan 9名称空间),所以运行时现在将锁定的线程视为不适合重用或创建新线程。嵌套调用
LockOSThread
和UnlockOSThread
的行为已经改变。这些函数控制是否将goroutine锁定到特定的操作系统线程,以便goroutine仅在该线程上运行,并且线程仅运行该goroutine。以前,连续多次调用
LockOSThread
相当于调用它一次,而单个UnlockOSThread
总是解锁线程。现在,调用嵌套:如果多次调用
LockOSThread
,则必须调用UnlockOSThread
相同的次数才能解锁线程。