为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 中 runtime.LockOSThread 的好处

Golang 中 runtime.LockOSThread 的好处

Go
米琪卡哇伊 2021-08-10 16:03:28
Golang 支持LockOSThread()使当前的 goroutine 只绑定到当前的 OS 线程,它也可以UnlockOSThread()。是否有任何用例可以从此功能中受益?
查看完整描述

3 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

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

os.LockOSThread()当 Go 必须与一些外部库(例如 C 库)交互时,该机制非常有用。它保证对该库的多次连续调用将在同一线程中完成。

这在几种情况下很有趣:

  • 许多图形库(OS X Cocoa、OpenGL、SDL 等)要求所有调用都在特定线程(或某些情况下的主线程)上完成。

  • 一些外部库基于线程本地存储(TLS) 设施。它们在附加到线程的数据结构中存储一些上下文。或者 API 的某些函数提供的结果的内存生命周期附加到线程。这个概念在 Windows 和类 Unix 系统中都有使用。一个典型的例子是 C 库中常用的 errno 全局变量,用于存储错误代码。在支持多线程的系统上,errno通常被定义为线程局部变量。

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


查看完整回答
反对 回复 2021-08-10
?
四季花海

TA贡献1811条经验 获得超5个赞

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

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

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

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

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


查看完整回答
反对 回复 2021-08-10
  • 3 回答
  • 0 关注
  • 960 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信