【问题标题】:Benefits of runtime.LockOSThread in GolangGolang 中 runtime.LockOSThread 的好处
【发布时间】:2014-08-18 11:05:16
【问题描述】:

Golang 支持 LockOSThread() 使当前 goroutine 独占绑定到当前 OS 线程,也可以 UnlockOSThread()

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

【问题讨论】:

  • 假设你有 8 个处理器线程和 16 个 goroutine。这意味着每个真实线程平均有两个 goroutine。现在,如果您正在构建实时的东西,您希望能够尽快运行代码并避免 goroutine 与线程的匹配,您不希望您的实时代码“落后于”不太重要的代码。这可以解决优先级反转问题等。虽然计划激活可以缓解这种情况。
  • golang.org/src/pkg/net/lookup_windows.go 中可以找到使用此功能的一个很好的例子。我建议在 Google 上搜索“lockosthread site:golang.org/src/pkg/”。
  • 感谢您的信息。 @BenjaminGruenbaum。
  • 例子很棒,谢谢@Intermernet

标签: go


【解决方案1】:

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

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

这在几种情况下很有趣:

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

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

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

【讨论】:

  • 很棒的总结!!它还为我提供了有关如何优化 CGO 包装的 Clib 调用的想法,这正是我所需要的。谢谢
  • 嗯,关于优化 Cgo 调用或不在 Gonuts 上的进一步讨论groups.google.com/forum/#!topic/Golang-Nuts/VB_9P29X040(在了解更多内部信息后,我上面的想法可能对 Cgo 性能没有帮助。)
  • 也是很好的文章,描述了调度程序的工作原理。 morsmachine.dk/go-scheduler
  • 补充一点很重要,做任何类型的 linux 命名空间切换(例如取消共享网络或进程命名空间)也绑定到一个线程,所以如果你在你可能得到部分之前不锁定操作系统线程您的代码随机调度到不同的网络/进程命名空间中。
【解决方案2】:

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

转到 Wiki page 关于 LockOsThread 以及如何使用它的示例。

关于在 SDL 中使用 LockOsThread 的 Google 群组 discussion

【讨论】:

    【解决方案3】:

    正如mentioned hereruntime.LockOSThread 所做的是防止任何其他 goroutine 在同一线程上运行。
    但请注意,Go 1.10 (Q1 2018) 会稍微改变它的用法:

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

    LockOSThreadUnlockOSThread 的嵌套调用的行为已更改。这些函数控制一个 goroutine 是否被锁定到一个特定的操作系统线程,以便 goroutine 只运行在那个线程上,而线程只运行那个 goroutine。

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-07
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 2016-03-04
      • 2023-01-27
      相关资源
      最近更新 更多