Golang中的runtime.LockOSThread的好处

问题描述 投票:17回答:3

Golang支持LockOSThread()使当前的goroutine专门绑定到当前的OS线程,它也可以UnlockOSThread()

是否有任何用例受益于此功能?

go
3个回答
19
投票

使用Go线程模型,对C代码,汇编代码或阻塞系统调用的调用发生在与调用Go代码相同的线程中,该代码由Go运行时调度程序管理。

当Go必须与一些外部库(例如C库)接口时,os.LockOSThread()机制非常有用。它保证在同一个线程中对该库进行多次连续调用。

这在几种情况下很有趣:

  • 许多graphic libraries(OS X Cocoa,OpenGL,SDL,...)要求在特定线程(或某些情况下的主线程)上完成所有调用。
  • 一些外国图书馆基于thread local storage(TLS)设施。它们将一些上下文存储在附加到线程的数据结构中。或者API的某些功能提供其内存生命周期附加到线程的结果。这个概念用于Windows和类Unix系统。典型示例是C库中常用于存储错误代码的errno全局变量。在支持多线程的系统上,errno通常被定义为线程局部变量。
  • 更一般地,一些外国库可以使用线程标识符来索引/管理内部资源。

4
投票

runtime.LockOsThread它通常用于调用需要在主线程中运行的C代码,就像在图形库中一样。

关于LockOsThread的Wi​​ki page以及如何使用它的示例。

谷歌组织discussion关于在SDL中使用LockOsThread。


0
投票

作为mentioned hereruntime.LockOSThread所做的是阻止任何其他goroutine在同一个线程上运行。 但请注意,Go 1.10 (Q1 2018)将改变其用法:

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

嵌套调用LockOSThreadUnlockOSThread的行为已经改变。这些函数控制是否将goroutine锁定到特定的操作系统线程,以便goroutine仅在该线程上运行,并且线程仅运行该goroutine。

以前,连续多次调用LockOSThread相当于调用它一次,而单个UnlockOSThread总是解锁线程。

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

© www.soinside.com 2019 - 2024. All rights reserved.