Golang 中 runtime.LockOSThread 的好处

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通常被定义为线程局部变量。更一般地,一些外部库可能使用线程标识符来索引/管理内部资源。

四季花海

正如这里提到的,什么runtime.LockOSThread是阻止任何其他 goroutine 在同一线程上运行。但请注意,Go 1.10(2018 年第一季度)将稍微改变其用法:因为LockOSThreadand 的一个常见用途UnlockOSThread是允许 Go 代码可靠地修改线程本地状态(例如,Linux 或 Plan 9 命名空间),所以运行时现在将锁定的线程视为不适合重用或创建新线程。嵌套调用LockOSThread和的行为UnlockOSThread已经改变。这些函数控制 goroutine 是否锁定到特定的操作系统线程,以便 goroutine 只在该线程上运行,并且线程只运行该 goroutine。之前LockOSThread连续调用多次就相当于调用一次,单次UnlockOSThread总是解锁线程。现在,调用嵌套:如果LockOSThread被多次调用,UnlockOSThread必须调用相同的次数才能解锁线程。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go