gpt4 book ai didi

winapi - Go 调度程序是否还管理在运行时创建的非 Go 线程?

转载 作者:IT王子 更新时间:2023-10-29 02:12:30 26 4
gpt4 key购买 nike

据我所知,Go 运行时调度器管理一定数量的 OS 线程(可能比 GOMAXPROCS 多?)和 Go 例程,通过不断地将 Go 例程分配给 OS 线程。

所以这基本上意味着 Go 例程的执行,包括 main goroutine ,由 go 调度程序和操作系统的线程调度管理。

现在这是我的问题..

  1. 如果我在 goroutine 开始时调用 runtime.LockOSThread(),goroutine 的执行是否完全由操作系统的线程调度管理?

  2. 非 Go 线程的执行是否也完全由 OS 的线程调度管理?换句话说,如果我通过 CreateThread 函数(Windows)创建一个非 Go 线程,那么管理非 Go 线程的执行超出了 Go 的运行时调度程序的范围?

  3. 如果我在那个非 Go 线程中使用 go func() 启动另一个 goroutine 会怎样?非 Go 线程和 goroutine 的执行是如何管理的?

  4. 目前,我正在用 Golang 编写一个程序,它在 go 程序的 main() 函数中运行一个 windows 消息循环。大多数时候它运行良好,但有时消息循环被阻塞并在几秒钟后恢复,然后大量旧消息被抽出。(我的另一个问题:Windows Message Loop is getting blocked and resumed intermittently (golang))

    我不知道为什么会这样,所以我怀疑是 go scheduler 切换了 main goroutine 的 OS Thread。所以我在 main() 函数的开头添加了 runtime.LockOSThread() 以确保 Windows 消息循环始终在同一线程中运行。但是,问题还是出现了!

    我仍然不知道为什么会出现这种情况,但我怀疑这是因为 Go 调度程序,因为用 Python 3.4 编写的相同逻辑不会产生任何这样的问题。

    所以我现在尝试的是通过调用 CreateThread(...) 函数创建一个新的 Windows 线程(非 Go 线程),并在该线程中运行 Windows 消息循环。

    但我很好奇,从 Go 运行时调度程序的角度来看,这种方法是否与在运行 Windows 消息循环的主 goroutine 中调用 runtime.LockOSThread() 不同。

    所以我的问题是,'如果我使用 CreateThread(...) 函数创建一个新的非 Go 线程并在该线程中运行 Windows 消息循环,那么该线程的执行是否不受影响由 Go 的运行时调度程序?”

任何帮助或想法将不胜感激。谢谢。

最佳答案

如果您使用 CreateThread() 例程运行一个新的操作系统线程,Go 的调度程序将不会触及该线程。但是,您随后必须为该线程实现一种与 Goroutines 通信的方法。例如,您不能直接从 CreateThread() 创建的线程调用 Go 方法。相反,您将不得不使用一些基于 C 的系统来轮询来自 Goroutine 的事件。

顺便说一句,如果你想从主操作系统线程运行循环,你应该在 init() 而不是 中调用 LockOSThread()主要()。参见 https://github.com/golang/go/wiki/LockOSThread :

func init() {
runtime.LockOSThread();
}
func main() {
// Run loop here.
}

关于winapi - Go 调度程序是否还管理在运行时创建的非 Go 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42264882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com