3 回答
TA贡献1807条经验 获得超9个赞
在 Go 线程模型中,对 C 代码、汇编代码或阻塞系统调用的调用发生在与调用 Go 代码相同的线程中,该线程由 Go 运行时调度程序管理。
os.LockOSThread()
当 Go 必须与一些外部库(例如 C 库)交互时,该机制非常有用。它保证对该库的多次连续调用将在同一线程中完成。
这在几种情况下很有趣:
许多图形库(OS X Cocoa、OpenGL、SDL 等)要求所有调用都在特定线程(或某些情况下的主线程)上完成。
一些外部库基于线程本地存储(TLS) 设施。它们在附加到线程的数据结构中存储一些上下文。或者 API 的某些函数提供的结果的内存生命周期附加到线程。这个概念在 Windows 和类 Unix 系统中都有使用。一个典型的例子是 C 库中常用的 errno 全局变量,用于存储错误代码。在支持多线程的系统上,errno通常被定义为线程局部变量。
更一般地,一些外部库可能使用线程标识符来索引/管理内部资源。
TA贡献1811条经验 获得超5个赞
正如这里提到的,什么runtime.LockOSThread
是阻止任何其他 goroutine 在同一线程上运行。
但请注意,Go 1.10(2018 年第一季度)将稍微改变其用法:
因为
LockOSThread
and 的一个常见用途UnlockOSThread
是允许 Go 代码可靠地修改线程本地状态(例如,Linux 或 Plan 9 命名空间),所以运行时现在将锁定的线程视为不适合重用或创建新线程。嵌套调用
LockOSThread
和的行为UnlockOSThread
已经改变。这些函数控制 goroutine 是否锁定到特定的操作系统线程,以便 goroutine 只在该线程上运行,并且线程只运行该 goroutine。之前
LockOSThread
连续调用多次就相当于调用一次,单次UnlockOSThread
总是解锁线程。现在,调用嵌套:如果
LockOSThread
被多次调用,UnlockOSThread
必须调用相同的次数才能解锁线程。
- 3 回答
- 0 关注
- 960 浏览
添加回答
举报